Initial Commit
This commit is contained in:
17
lib/borealis/COPYING
Normal file
17
lib/borealis/COPYING
Normal file
@@ -0,0 +1,17 @@
|
||||
Copyright (c) 2019 fincs
|
||||
|
||||
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.
|
||||
674
lib/borealis/LICENSE
Normal file
674
lib/borealis/LICENSE
Normal file
@@ -0,0 +1,674 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Use with the GNU Affero General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU Affero General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program does terminal interaction, make it output a short
|
||||
notice like this when it starts in an interactive mode:
|
||||
|
||||
<program> Copyright (C) <year> <name of author>
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, your program's commands
|
||||
might be different; for a GUI interface, you would use an "about box".
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU GPL, see
|
||||
<https://www.gnu.org/licenses/>.
|
||||
|
||||
The GNU General Public License does not permit incorporating your program
|
||||
into proprietary programs. If your program is a subroutine library, you
|
||||
may consider it more useful to permit linking proprietary applications with
|
||||
the library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License. But first, please read
|
||||
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|
||||
231
lib/borealis/Makefile
Normal file
231
lib/borealis/Makefile
Normal file
@@ -0,0 +1,231 @@
|
||||
#---------------------------------------------------------------------------------
|
||||
.SUFFIXES:
|
||||
#---------------------------------------------------------------------------------
|
||||
|
||||
ifeq ($(strip $(DEVKITPRO)),)
|
||||
$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=<path to>/devkitpro")
|
||||
endif
|
||||
|
||||
TOPDIR ?= $(CURDIR)
|
||||
include $(DEVKITPRO)/libnx/switch_rules
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# TARGET is the name of the output
|
||||
# BUILD is the directory where object files & intermediate files will be placed
|
||||
# SOURCES is a list of directories containing source code
|
||||
# DATA is a list of directories containing data files
|
||||
# INCLUDES is a list of directories containing header files
|
||||
# ROMFS is the directory containing data to be added to RomFS, relative to the Makefile (Optional)
|
||||
#
|
||||
# NO_ICON: if set to anything, do not use icon.
|
||||
# NO_NACP: if set to anything, no .nacp file is generated.
|
||||
# APP_TITLE is the name of the app stored in the .nacp file (Optional)
|
||||
# APP_AUTHOR is the author of the app stored in the .nacp file (Optional)
|
||||
# APP_VERSION is the version of the app stored in the .nacp file (Optional)
|
||||
# APP_TITLEID is the titleID of the app stored in the .nacp file (Optional)
|
||||
# ICON is the filename of the icon (.jpg), relative to the project folder.
|
||||
# If not set, it attempts to use one of the following (in this order):
|
||||
# - <Project name>.jpg
|
||||
# - icon.jpg
|
||||
# - <libnx folder>/default_icon.jpg
|
||||
#
|
||||
# CONFIG_JSON is the filename of the NPDM config file (.json), relative to the project folder.
|
||||
# If not set, it attempts to use one of the following (in this order):
|
||||
# - <Project name>.json
|
||||
# - config.json
|
||||
# If a JSON file is provided or autodetected, an ExeFS PFS0 (.nsp) is built instead
|
||||
# of a homebrew executable (.nro). This is intended to be used for sysmodules.
|
||||
# NACP building is skipped as well.
|
||||
#---------------------------------------------------------------------------------
|
||||
TARGET := borealis_example
|
||||
BUILD := build.nx
|
||||
SOURCES := example
|
||||
DATA := data
|
||||
ICON := resources/icon/borealis.jpg
|
||||
INCLUDES := example
|
||||
APP_TITLE := borealis example
|
||||
APP_AUTHOR := natinusala
|
||||
APP_VERSION := 1.0
|
||||
|
||||
ROMFS := resources
|
||||
BOREALIS_PATH := .
|
||||
BOREALIS_RESOURCES := romfs:/
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# options for code generation
|
||||
#---------------------------------------------------------------------------------
|
||||
ARCH := -march=armv8-a+crc+crypto -mtune=cortex-a57 -mtp=soft -fPIE
|
||||
|
||||
CFLAGS := -g -Wall -O2 -ffunction-sections \
|
||||
$(ARCH) $(DEFINES)
|
||||
|
||||
CFLAGS += $(INCLUDE) -D__SWITCH__ \
|
||||
-DBOREALIS_RESOURCES="\"$(BOREALIS_RESOURCES)\""
|
||||
|
||||
CXXFLAGS := $(CFLAGS) -std=c++1z -O2 -Wno-volatile
|
||||
|
||||
ASFLAGS := -g $(ARCH)
|
||||
LDFLAGS = -specs=$(DEVKITPRO)/libnx/switch.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map)
|
||||
|
||||
LIBS := -lnx -lm
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# list of directories containing libraries, this must be the top level containing
|
||||
# include and lib
|
||||
#---------------------------------------------------------------------------------
|
||||
LIBDIRS := $(PORTLIBS) $(LIBNX)
|
||||
|
||||
include $(TOPDIR)/library/borealis.mk
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# no real need to edit anything past this point unless you need to add additional
|
||||
# rules for different file extensions
|
||||
#---------------------------------------------------------------------------------
|
||||
ifneq ($(BUILD),$(notdir $(CURDIR)))
|
||||
#---------------------------------------------------------------------------------
|
||||
|
||||
export OUTPUT := $(CURDIR)/$(TARGET)
|
||||
export TOPDIR := $(CURDIR)
|
||||
|
||||
export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \
|
||||
$(foreach dir,$(DATA),$(CURDIR)/$(dir))
|
||||
|
||||
export DEPSDIR := $(CURDIR)/$(BUILD)
|
||||
|
||||
CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))
|
||||
CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp)))
|
||||
SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s)))
|
||||
BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*)))
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# use CXX for linking C++ projects, CC for standard C
|
||||
#---------------------------------------------------------------------------------
|
||||
ifeq ($(strip $(CPPFILES)),)
|
||||
#---------------------------------------------------------------------------------
|
||||
export LD := $(CC)
|
||||
#---------------------------------------------------------------------------------
|
||||
else
|
||||
#---------------------------------------------------------------------------------
|
||||
export LD := $(CXX)
|
||||
#---------------------------------------------------------------------------------
|
||||
endif
|
||||
#---------------------------------------------------------------------------------
|
||||
|
||||
export OFILES_BIN := $(addsuffix .o,$(BINFILES))
|
||||
export OFILES_SRC := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o)
|
||||
export OFILES := $(OFILES_BIN) $(OFILES_SRC)
|
||||
export HFILES_BIN := $(addsuffix .h,$(subst .,_,$(BINFILES)))
|
||||
|
||||
export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \
|
||||
$(foreach dir,$(LIBDIRS),-I$(dir)/include) \
|
||||
-I$(CURDIR)/$(BUILD)
|
||||
|
||||
export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib)
|
||||
|
||||
ifeq ($(strip $(CONFIG_JSON)),)
|
||||
jsons := $(wildcard *.json)
|
||||
ifneq (,$(findstring $(TARGET).json,$(jsons)))
|
||||
export APP_JSON := $(TOPDIR)/$(TARGET).json
|
||||
else
|
||||
ifneq (,$(findstring config.json,$(jsons)))
|
||||
export APP_JSON := $(TOPDIR)/config.json
|
||||
endif
|
||||
endif
|
||||
else
|
||||
export APP_JSON := $(TOPDIR)/$(CONFIG_JSON)
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(ICON)),)
|
||||
icons := $(wildcard *.jpg)
|
||||
ifneq (,$(findstring $(TARGET).jpg,$(icons)))
|
||||
export APP_ICON := $(TOPDIR)/$(TARGET).jpg
|
||||
else
|
||||
ifneq (,$(findstring icon.jpg,$(icons)))
|
||||
export APP_ICON := $(TOPDIR)/icon.jpg
|
||||
endif
|
||||
endif
|
||||
else
|
||||
export APP_ICON := $(TOPDIR)/$(ICON)
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(NO_ICON)),)
|
||||
export NROFLAGS += --icon=$(APP_ICON)
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(NO_NACP)),)
|
||||
export NROFLAGS += --nacp=$(CURDIR)/$(TARGET).nacp
|
||||
endif
|
||||
|
||||
ifneq ($(APP_TITLEID),)
|
||||
export NACPFLAGS += --titleid=$(APP_TITLEID)
|
||||
endif
|
||||
|
||||
ifneq ($(ROMFS),)
|
||||
export NROFLAGS += --romfsdir=$(CURDIR)/$(ROMFS)
|
||||
endif
|
||||
|
||||
.PHONY: $(BUILD) clean all
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
all: $(BUILD)
|
||||
|
||||
$(BUILD):
|
||||
@[ -d $@ ] || mkdir -p $@
|
||||
@MSYS2_ARG_CONV_EXCL="-D;$(MSYS2_ARG_CONV_EXCL)" $(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
clean:
|
||||
@echo clean ...
|
||||
ifeq ($(strip $(APP_JSON)),)
|
||||
@rm -fr $(BUILD) $(TARGET).nro $(TARGET).nacp $(TARGET).elf
|
||||
else
|
||||
@rm -fr $(BUILD) $(TARGET).nsp $(TARGET).nso $(TARGET).npdm $(TARGET).elf
|
||||
endif
|
||||
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
else
|
||||
.PHONY: all
|
||||
|
||||
DEPENDS := $(OFILES:.o=.d)
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# main targets
|
||||
#---------------------------------------------------------------------------------
|
||||
ifeq ($(strip $(APP_JSON)),)
|
||||
|
||||
all : $(OUTPUT).nro
|
||||
|
||||
ifeq ($(strip $(NO_NACP)),)
|
||||
$(OUTPUT).nro : $(OUTPUT).elf $(OUTPUT).nacp
|
||||
else
|
||||
$(OUTPUT).nro : $(OUTPUT).elf
|
||||
endif
|
||||
|
||||
else
|
||||
|
||||
all : $(OUTPUT).nsp
|
||||
|
||||
$(OUTPUT).nsp : $(OUTPUT).nso $(OUTPUT).npdm
|
||||
|
||||
$(OUTPUT).nso : $(OUTPUT).elf
|
||||
|
||||
endif
|
||||
|
||||
$(OUTPUT).elf : $(OFILES)
|
||||
|
||||
$(OFILES_SRC) : $(HFILES_BIN)
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# you need a rule like this for each extension you use as binary data
|
||||
#---------------------------------------------------------------------------------
|
||||
%.bin.o %_bin.h : %.bin
|
||||
#---------------------------------------------------------------------------------
|
||||
@echo $(notdir $<)
|
||||
@$(bin2o)
|
||||
|
||||
-include $(DEPENDS)
|
||||
|
||||
#---------------------------------------------------------------------------------------
|
||||
endif
|
||||
#---------------------------------------------------------------------------------------
|
||||
65
lib/borealis/README.md
Normal file
65
lib/borealis/README.md
Normal file
@@ -0,0 +1,65 @@
|
||||
# borealis
|
||||
|
||||
Hardware accelerated, Nintendo Switch inspired UI library for PC and Nintendo Switch. Powered by nanovg. Skeleton based on the [hybrid glfw app](https://github.com/fincs/hybrid_app) by fincs.
|
||||
|
||||
The library is still in early development and WILL lack features and contain bugs. Feel free to report them in the issues, or make a pull request if you happen to fix some.
|
||||
|
||||
You can see the planned features in the Projects tab.
|
||||
|
||||
Documentation is available [right here](https://github.com/natinusala/borealis/wiki). Warning: may not be up to date.
|
||||
|
||||
## Building the example for Switch
|
||||
|
||||
To build for Switch, a standard development environment must first be set up. In order to do so, [refer to the Getting Started guide](https://devkitpro.org/wiki/Getting_Started).
|
||||
|
||||
```bash
|
||||
(sudo) (dkp-)pacman -S switch-glfw switch-mesa switch-glm
|
||||
make -j
|
||||
nxlink -s borealis_example.nro
|
||||
```
|
||||
|
||||
## Building the example for PC
|
||||
|
||||
To build for PC, the following components are required:
|
||||
|
||||
- meson/ninja build system
|
||||
- A C++ compiler supporting the C++17 standard
|
||||
- GLFW version 3.3 or higher (as a static library)
|
||||
- GLM version 0.9.8 or higher
|
||||
|
||||
Please refer to the usual sources of information for your particular operating system. Usually the commands needed to build this project will look like this:
|
||||
|
||||
```bash
|
||||
meson build
|
||||
ninja -C build
|
||||
./build/borealis_example
|
||||
```
|
||||
|
||||
Also, please note that the `resources` folder must be available in the working directory, otherwise the program will fail to find the shaders.
|
||||
|
||||
### Building the example for Windows using msys2
|
||||
|
||||
msys2 provides all packages needed to build this project:
|
||||
|
||||
```bash
|
||||
pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-meson mingw-w64-x86_64-ninja mingw-w64-x86_64-pkg-config mingw-w64-x86_64-glfw mingw-w64-x86_64-glm
|
||||
meson build
|
||||
ninja -C build
|
||||
./build/borealis_example
|
||||
```
|
||||
|
||||
### Including in your project (TL;DR: see the example makefile in this repo)
|
||||
0. Your project must be built as C++17 (`-std=c++1z`). You also need to remove `-fno-rtti` and `-fno-exceptions` if you have them
|
||||
1. Use a submodule (or even better, a [subrepo](https://github.com/ingydotnet/git-subrepo)) to clone this repository in your project
|
||||
2. Copy the `resources` folder to the root of your project
|
||||
3. For PC (meson):
|
||||
1. take a standard meson file
|
||||
2. use `subdir` to import the library folder
|
||||
3. use the `borealis_files`, `borealis_dependencies` and `borealis_include` variables for respectively objects to build, dependencies (glfw...) and includes directory
|
||||
4. add a `BOREALIS_RESOURCES` define pointing to the resources folder at runtime (so `resources`)
|
||||
4. For Switch:
|
||||
1. take a standard homebrew makefile
|
||||
2. add a `BOREALIS_PATH` variable containing the subfolder you put the library in
|
||||
3. use `include` to load `borealis.mk` (after `LIBDIRS` and `BOREALIS_PATH`)
|
||||
4. set `ROMFS` to the resources folder
|
||||
5. add a `BOREALIS_RESOURCES` define pointing to the resources folder at runtime (so `romfs:/`)
|
||||
97
lib/borealis/example/custom_layout_tab.cpp
Normal file
97
lib/borealis/example/custom_layout_tab.cpp
Normal file
@@ -0,0 +1,97 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2020 natinusala
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "custom_layout_tab.hpp"
|
||||
|
||||
using namespace brls::i18n::literals;
|
||||
|
||||
CustomLayoutTab::CustomLayoutTab()
|
||||
{
|
||||
// Create views
|
||||
this->firstButton = new brls::Button(brls::ButtonStyle::REGULAR);
|
||||
this->firstButton->setLabel("custom_layout/first_button"_i18n);
|
||||
this->addView(this->firstButton);
|
||||
|
||||
this->secondButton = new brls::Button(brls::ButtonStyle::REGULAR);
|
||||
this->secondButton->setLabel("custom_layout/second_button"_i18n);
|
||||
this->addView(this->secondButton);
|
||||
|
||||
this->thirdButton = new brls::Button(brls::ButtonStyle::REGULAR);
|
||||
this->thirdButton->setLabel("custom_layout/third_button"_i18n);
|
||||
this->addView(this->thirdButton);
|
||||
|
||||
// Populate custom navigation map
|
||||
this->navigationMap.add(
|
||||
this->firstButton,
|
||||
brls::FocusDirection::RIGHT,
|
||||
this->secondButton);
|
||||
|
||||
this->navigationMap.add(
|
||||
this->secondButton,
|
||||
brls::FocusDirection::LEFT,
|
||||
this->firstButton);
|
||||
|
||||
this->navigationMap.add(
|
||||
this->secondButton,
|
||||
brls::FocusDirection::DOWN,
|
||||
this->thirdButton);
|
||||
|
||||
this->navigationMap.add(
|
||||
this->thirdButton,
|
||||
brls::FocusDirection::UP,
|
||||
this->secondButton);
|
||||
}
|
||||
|
||||
#define BUTTON_WIDTH 300
|
||||
#define BUTTON_HEIGHT 50
|
||||
#define PADDING 75
|
||||
|
||||
void CustomLayoutTab::layout(NVGcontext* vg, brls::Style* style, brls::FontStash* stash)
|
||||
{
|
||||
int x = this->getX();
|
||||
int y = this->getY();
|
||||
|
||||
// Fully custom layout
|
||||
this->firstButton->setBoundaries(
|
||||
x + PADDING,
|
||||
y + PADDING,
|
||||
BUTTON_WIDTH,
|
||||
BUTTON_HEIGHT);
|
||||
|
||||
this->secondButton->setBoundaries(
|
||||
x + PADDING * 2 + BUTTON_WIDTH,
|
||||
y + PADDING,
|
||||
BUTTON_WIDTH,
|
||||
BUTTON_HEIGHT);
|
||||
|
||||
this->thirdButton->setBoundaries(
|
||||
x + PADDING * 2 + BUTTON_WIDTH,
|
||||
y + PADDING * 2 + BUTTON_HEIGHT,
|
||||
BUTTON_WIDTH,
|
||||
BUTTON_HEIGHT);
|
||||
}
|
||||
|
||||
brls::View* CustomLayoutTab::getDefaultFocus()
|
||||
{
|
||||
return this->firstButton->getDefaultFocus();
|
||||
}
|
||||
|
||||
brls::View* CustomLayoutTab::getNextFocus(brls::FocusDirection direction, brls::View* currentView)
|
||||
{
|
||||
return this->navigationMap.getNextFocus(direction, currentView);
|
||||
}
|
||||
36
lib/borealis/example/custom_layout_tab.hpp
Normal file
36
lib/borealis/example/custom_layout_tab.hpp
Normal file
@@ -0,0 +1,36 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2020 natinusala
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <borealis.hpp>
|
||||
|
||||
class CustomLayoutTab : public brls::AbsoluteLayout
|
||||
{
|
||||
public:
|
||||
CustomLayoutTab();
|
||||
|
||||
brls::View* getDefaultFocus() override;
|
||||
brls::View* getNextFocus(brls::FocusDirection direction, brls::View* currentView) override;
|
||||
void layout(NVGcontext* vg, brls::Style* style, brls::FontStash* stash);
|
||||
|
||||
private:
|
||||
brls::NavigationMap navigationMap;
|
||||
|
||||
brls::Button* firstButton;
|
||||
brls::Button* secondButton;
|
||||
brls::Button* thirdButton;
|
||||
};
|
||||
197
lib/borealis/example/main.cpp
Normal file
197
lib/borealis/example/main.cpp
Normal file
@@ -0,0 +1,197 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019-2020 natinusala
|
||||
Copyright (C) 2019 p-sam
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <borealis.hpp>
|
||||
#include <string>
|
||||
|
||||
#include "custom_layout_tab.hpp"
|
||||
#include "sample_installer_page.hpp"
|
||||
#include "sample_loading_page.hpp"
|
||||
|
||||
namespace i18n = brls::i18n; // for loadTranslations() and getStr()
|
||||
using namespace i18n::literals; // for _i18n
|
||||
|
||||
std::vector<std::string> NOTIFICATIONS = {
|
||||
"You have cool hair",
|
||||
"I like your shoes",
|
||||
"borealis is powered by nanovg",
|
||||
"The Triforce is an inside job",
|
||||
"Pozznx will trigger in one day and twelve hours",
|
||||
"Aurora Borealis? At this time of day, at this time of year, in this part of the gaming market, located entirely within your Switch?!",
|
||||
"May I see it?",
|
||||
"Hmm, Steamed Hams!"
|
||||
};
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
// Init the app
|
||||
brls::Logger::setLogLevel(brls::LogLevel::DEBUG);
|
||||
|
||||
i18n::loadTranslations();
|
||||
if (!brls::Application::init("main/name"_i18n))
|
||||
{
|
||||
brls::Logger::error("Unable to init Borealis application");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
// Create a sample view
|
||||
brls::TabFrame* rootFrame = new brls::TabFrame();
|
||||
rootFrame->setTitle("main/name"_i18n);
|
||||
rootFrame->setIcon(BOREALIS_ASSET("icon/borealis.jpg"));
|
||||
|
||||
brls::List* testList = new brls::List();
|
||||
|
||||
brls::ListItem* dialogItem = new brls::ListItem("main/pozznx/open"_i18n);
|
||||
dialogItem->getClickEvent()->subscribe([](brls::View* view) {
|
||||
brls::Dialog* dialog = new brls::Dialog("main/pozznx/warning"_i18n);
|
||||
|
||||
brls::GenericEvent::Callback closeCallback = [dialog](brls::View* view) {
|
||||
dialog->close();
|
||||
brls::Application::notify("main/pozznx/running"_i18n);
|
||||
};
|
||||
|
||||
std::string continueStr = "main/pozznx/continue"_i18n;
|
||||
|
||||
dialog->addButton(continueStr, closeCallback);
|
||||
dialog->addButton(continueStr, closeCallback);
|
||||
dialog->addButton(continueStr, closeCallback);
|
||||
|
||||
dialog->setCancelable(false);
|
||||
|
||||
dialog->open();
|
||||
});
|
||||
|
||||
brls::ListItem* notificationItem = new brls::ListItem("main/notify"_i18n);
|
||||
notificationItem->getClickEvent()->subscribe([](brls::View* view) {
|
||||
std::string notification = NOTIFICATIONS[std::rand() % NOTIFICATIONS.size()];
|
||||
brls::Application::notify(notification);
|
||||
});
|
||||
|
||||
brls::ListItem* themeItem = new brls::ListItem("main/tv/resolution"_i18n);
|
||||
themeItem->setValue("main/tv/automatic"_i18n);
|
||||
|
||||
brls::ListItem* i18nItem = new brls::ListItem(i18n::getStr("main/i18n/title", i18n::getCurrentLocale(), "main/i18n/lang"_i18n));
|
||||
|
||||
brls::SelectListItem* jankItem = new brls::SelectListItem(
|
||||
"main/jank/jank"_i18n,
|
||||
{
|
||||
"main/jank/native"_i18n,
|
||||
"main/jank/minimal"_i18n,
|
||||
"main/jank/regular"_i18n,
|
||||
"main/jank/maximum"_i18n,
|
||||
"main/jank/saxophone"_i18n,
|
||||
"main/jank/vista"_i18n,
|
||||
"main/jank/ios"_i18n,
|
||||
});
|
||||
|
||||
brls::ListItem* crashItem = new brls::ListItem("main/divide/title"_i18n, "main/divide/description"_i18n);
|
||||
crashItem->getClickEvent()->subscribe([](brls::View* view) { brls::Application::crash("main/divide/crash"_i18n); });
|
||||
|
||||
brls::ListItem* popupItem = new brls::ListItem("popup/open"_i18n);
|
||||
popupItem->getClickEvent()->subscribe([](brls::View* view) {
|
||||
brls::TabFrame* popupTabFrame = new brls::TabFrame();
|
||||
popupTabFrame->addTab("popup/red"_i18n, new brls::Rectangle(nvgRGB(255, 0, 0)));
|
||||
popupTabFrame->addTab("popup/green"_i18n, new brls::Rectangle(nvgRGB(0, 255, 0)));
|
||||
popupTabFrame->addTab("popup/blue"_i18n, new brls::Rectangle(nvgRGB(0, 0, 255)));
|
||||
brls::PopupFrame::open("popup/title"_i18n, BOREALIS_ASSET("icon/borealis.jpg"), popupTabFrame, "popup/subtitle/left"_i18n, "popup/subtitle/right"_i18n);
|
||||
});
|
||||
|
||||
brls::ListItem* installerItem = new brls::ListItem("installer/open"_i18n);
|
||||
installerItem->getClickEvent()->subscribe([](brls::View* view) {
|
||||
brls::StagedAppletFrame* stagedFrame = new brls::StagedAppletFrame();
|
||||
stagedFrame->setTitle("installer/title"_i18n);
|
||||
|
||||
stagedFrame->addStage(new SampleInstallerPage(stagedFrame, "installer/stage1/button"_i18n));
|
||||
stagedFrame->addStage(new SampleLoadingPage(stagedFrame));
|
||||
stagedFrame->addStage(new SampleInstallerPage(stagedFrame, "installer/stage3/button"_i18n));
|
||||
|
||||
brls::Application::pushView(stagedFrame);
|
||||
});
|
||||
|
||||
brls::SelectListItem* layerSelectItem = new brls::SelectListItem("main/layers/title"_i18n, { "main/layers/layer1"_i18n, "main/layers/layer2"_i18n });
|
||||
|
||||
brls::InputListItem* keyboardItem = new brls::InputListItem("main/keyboard/string/title"_i18n, "main/keyboard/string/default"_i18n, "main/keyboard/string/help"_i18n, "", 16);
|
||||
|
||||
brls::IntegerInputListItem* keyboardNumberItem = new brls::IntegerInputListItem("main/keyboard/number/title"_i18n, 1337, "main/keyboard/number/help"_i18n, "", 10);
|
||||
|
||||
testList->addView(dialogItem);
|
||||
testList->addView(notificationItem);
|
||||
testList->addView(themeItem);
|
||||
testList->addView(i18nItem);
|
||||
testList->addView(jankItem);
|
||||
testList->addView(crashItem);
|
||||
testList->addView(installerItem);
|
||||
testList->addView(popupItem);
|
||||
testList->addView(keyboardItem);
|
||||
testList->addView(keyboardNumberItem);
|
||||
|
||||
brls::Label* testLabel = new brls::Label(brls::LabelStyle::REGULAR, "main/more"_i18n, true);
|
||||
testList->addView(testLabel);
|
||||
|
||||
brls::ListItem* actionTestItem = new brls::ListItem("main/actions/title"_i18n);
|
||||
actionTestItem->registerAction("main/actions/notify"_i18n, brls::Key::L, [] {
|
||||
brls::Application::notify("main/actions/triggered"_i18n);
|
||||
return true;
|
||||
});
|
||||
testList->addView(actionTestItem);
|
||||
|
||||
brls::LayerView* testLayers = new brls::LayerView();
|
||||
brls::List* layerList1 = new brls::List();
|
||||
brls::List* layerList2 = new brls::List();
|
||||
|
||||
layerList1->addView(new brls::Header("main/layers/layer1"_i18n, false));
|
||||
layerList1->addView(new brls::ListItem("main/layers/item1"_i18n));
|
||||
layerList1->addView(new brls::ListItem("main/layers/item2"_i18n));
|
||||
layerList1->addView(new brls::ListItem("main/layers/item3"_i18n));
|
||||
|
||||
layerList2->addView(new brls::Header("main/layers/layer2"_i18n, false));
|
||||
layerList2->addView(new brls::ListItem("main/layers/item1"_i18n));
|
||||
layerList2->addView(new brls::ListItem("main/layers/item2"_i18n));
|
||||
layerList2->addView(new brls::ListItem("main/layers/item3"_i18n));
|
||||
|
||||
testLayers->addLayer(layerList1);
|
||||
testLayers->addLayer(layerList2);
|
||||
|
||||
layerSelectItem->getValueSelectedEvent()->subscribe([=](size_t selection) {
|
||||
testLayers->changeLayer(selection);
|
||||
});
|
||||
|
||||
testList->addView(layerSelectItem);
|
||||
|
||||
rootFrame->addTab("main/tabs/first"_i18n, testList);
|
||||
rootFrame->addTab("main/tabs/second"_i18n, testLayers);
|
||||
rootFrame->addSeparator();
|
||||
rootFrame->addTab("main/tabs/third"_i18n, new brls::Rectangle(nvgRGB(255, 0, 0)));
|
||||
rootFrame->addTab("main/tabs/fourth"_i18n, new brls::Rectangle(nvgRGB(0, 255, 0)));
|
||||
rootFrame->addSeparator();
|
||||
rootFrame->addTab("main/tabs/custom_navigation_tab"_i18n, new CustomLayoutTab());
|
||||
|
||||
// Add the root view to the stack
|
||||
brls::Application::pushView(rootFrame);
|
||||
|
||||
// Run the app
|
||||
while (brls::Application::mainLoop())
|
||||
;
|
||||
|
||||
// Exit
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
77
lib/borealis/example/sample_installer_page.cpp
Normal file
77
lib/borealis/example/sample_installer_page.cpp
Normal file
@@ -0,0 +1,77 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019 natinusala
|
||||
Copyright (C) 2019 Billy Laws
|
||||
Copyright (C) 2019 p-sam
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "sample_installer_page.hpp"
|
||||
|
||||
#include <math.h>
|
||||
|
||||
using namespace brls::i18n::literals;
|
||||
|
||||
SampleInstallerPage::SampleInstallerPage(brls::StagedAppletFrame* frame, std::string label)
|
||||
{
|
||||
// Label
|
||||
this->button = (new brls::Button(brls::ButtonStyle::BORDERLESS))->setLabel(label)->setImage(BOREALIS_ASSET("icon/borealis.jpg"));
|
||||
this->button->setParent(this);
|
||||
this->button->getClickEvent()->subscribe([frame](View* view) {
|
||||
if (frame->isLastStage())
|
||||
brls::Application::popView();
|
||||
else
|
||||
frame->nextStage();
|
||||
});
|
||||
this->label = new brls::Label(brls::LabelStyle::DIALOG, "installer/stage1/text"_i18n, true);
|
||||
this->label->setHorizontalAlign(NVG_ALIGN_CENTER);
|
||||
this->label->setParent(this);
|
||||
}
|
||||
|
||||
void SampleInstallerPage::draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, brls::Style* style, brls::FrameContext* ctx)
|
||||
{
|
||||
this->label->frame(ctx);
|
||||
this->button->frame(ctx);
|
||||
}
|
||||
|
||||
brls::View* SampleInstallerPage::getDefaultFocus()
|
||||
{
|
||||
return this->button;
|
||||
}
|
||||
|
||||
void SampleInstallerPage::layout(NVGcontext* vg, brls::Style* style, brls::FontStash* stash)
|
||||
{
|
||||
this->label->setWidth(roundf((float)this->width * style->CrashFrame.labelWidth));
|
||||
this->label->invalidate(true);
|
||||
|
||||
this->label->setBoundaries(
|
||||
this->x + this->width / 2 - this->label->getWidth() / 2,
|
||||
this->y + (this->height - style->AppletFrame.footerHeight) / 2,
|
||||
this->label->getWidth(),
|
||||
this->label->getHeight());
|
||||
|
||||
this->button->setBoundaries(
|
||||
this->x + this->width / 2 - style->CrashFrame.buttonWidth / 2,
|
||||
this->y + this->height / 2 + style->CrashFrame.buttonHeight,
|
||||
style->CrashFrame.buttonWidth,
|
||||
style->CrashFrame.buttonHeight);
|
||||
this->button->invalidate();
|
||||
}
|
||||
|
||||
SampleInstallerPage::~SampleInstallerPage()
|
||||
{
|
||||
delete this->label;
|
||||
delete this->button;
|
||||
}
|
||||
38
lib/borealis/example/sample_installer_page.hpp
Normal file
38
lib/borealis/example/sample_installer_page.hpp
Normal file
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019 natinusala
|
||||
Copyright (C) 2019 Billy Laws
|
||||
Copyright (C) 2019 p-sam
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <borealis.hpp>
|
||||
|
||||
class SampleInstallerPage : public brls::View
|
||||
{
|
||||
private:
|
||||
brls::Button* button;
|
||||
brls::Label* label;
|
||||
|
||||
public:
|
||||
SampleInstallerPage(brls::StagedAppletFrame* frame, std::string label);
|
||||
~SampleInstallerPage();
|
||||
|
||||
void draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, brls::Style* style, brls::FrameContext* ctx) override;
|
||||
void layout(NVGcontext* vg, brls::Style* style, brls::FontStash* stash) override;
|
||||
brls::View* getDefaultFocus() override;
|
||||
};
|
||||
82
lib/borealis/example/sample_loading_page.cpp
Normal file
82
lib/borealis/example/sample_loading_page.cpp
Normal file
@@ -0,0 +1,82 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019 natinusala
|
||||
Copyright (C) 2019 Billy Laws
|
||||
Copyright (C) 2019 p-sam
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "sample_loading_page.hpp"
|
||||
|
||||
#include <math.h>
|
||||
|
||||
using namespace brls::i18n::literals;
|
||||
|
||||
SampleLoadingPage::SampleLoadingPage(brls::StagedAppletFrame* frame)
|
||||
: frame(frame)
|
||||
{
|
||||
// Label
|
||||
this->progressDisp = new brls::ProgressDisplay();
|
||||
this->progressDisp->setProgress(this->progressValue, 1000);
|
||||
this->progressDisp->setParent(this);
|
||||
this->label = new brls::Label(brls::LabelStyle::DIALOG, "installer/stage2/text"_i18n, true);
|
||||
this->label->setHorizontalAlign(NVG_ALIGN_CENTER);
|
||||
this->label->setParent(this);
|
||||
}
|
||||
|
||||
void SampleLoadingPage::draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, brls::Style* style, brls::FrameContext* ctx)
|
||||
{
|
||||
if (progressValue == 500)
|
||||
this->frame->nextStage();
|
||||
|
||||
this->progressValue++;
|
||||
this->progressDisp->setProgress(this->progressValue, 500);
|
||||
this->progressDisp->frame(ctx);
|
||||
this->label->frame(ctx);
|
||||
}
|
||||
|
||||
void SampleLoadingPage::layout(NVGcontext* vg, brls::Style* style, brls::FontStash* stash)
|
||||
{
|
||||
this->label->setWidth(roundf((float)this->width * style->CrashFrame.labelWidth));
|
||||
this->label->invalidate(true);
|
||||
|
||||
this->label->setBoundaries(
|
||||
this->x + this->width / 2 - this->label->getWidth() / 2,
|
||||
this->y + (this->height - style->AppletFrame.footerHeight) / 2,
|
||||
this->label->getWidth(),
|
||||
this->label->getHeight());
|
||||
|
||||
this->progressDisp->setBoundaries(
|
||||
this->x + this->width / 2 - style->CrashFrame.buttonWidth,
|
||||
this->y + this->height / 2,
|
||||
style->CrashFrame.buttonWidth * 2,
|
||||
style->CrashFrame.buttonHeight);
|
||||
}
|
||||
|
||||
void SampleLoadingPage::willAppear(bool resetState)
|
||||
{
|
||||
this->progressDisp->willAppear(resetState);
|
||||
}
|
||||
|
||||
void SampleLoadingPage::willDisappear(bool resetState)
|
||||
{
|
||||
this->progressDisp->willDisappear(resetState);
|
||||
}
|
||||
|
||||
SampleLoadingPage::~SampleLoadingPage()
|
||||
{
|
||||
delete this->progressDisp;
|
||||
delete this->label;
|
||||
}
|
||||
42
lib/borealis/example/sample_loading_page.hpp
Normal file
42
lib/borealis/example/sample_loading_page.hpp
Normal file
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019 natinusala
|
||||
Copyright (C) 2019 Billy Laws
|
||||
Copyright (C) 2019 p-sam
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <borealis.hpp>
|
||||
|
||||
class SampleLoadingPage : public brls::View
|
||||
{
|
||||
private:
|
||||
brls::StagedAppletFrame* frame;
|
||||
brls::ProgressDisplay* progressDisp;
|
||||
brls::Label* label;
|
||||
int progressValue = 0;
|
||||
|
||||
public:
|
||||
SampleLoadingPage(brls::StagedAppletFrame* frame);
|
||||
~SampleLoadingPage();
|
||||
|
||||
void draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, brls::Style* style, brls::FrameContext* ctx) override;
|
||||
void layout(NVGcontext* vg, brls::Style* style, brls::FontStash* stash) override;
|
||||
|
||||
void willAppear(bool resetState = false) override;
|
||||
void willDisappear(bool resetState = false) override;
|
||||
};
|
||||
20
lib/borealis/library/borealis.mk
Normal file
20
lib/borealis/library/borealis.mk
Normal file
@@ -0,0 +1,20 @@
|
||||
mkfile_path := $(abspath $(lastword $(MAKEFILE_LIST)))
|
||||
current_dir := $(BOREALIS_PATH)/$(notdir $(patsubst %/,%,$(dir $(mkfile_path))))
|
||||
|
||||
LIBS := -lglfw3 -lEGL -lglad -lglapi -ldrm_nouveau -lm $(LIBS)
|
||||
|
||||
# fmt wrapper is there because dkp's base
|
||||
# makefile doesn't recognize .cc files as c++
|
||||
|
||||
SOURCES := $(SOURCES) \
|
||||
$(current_dir)/lib \
|
||||
$(current_dir)/lib/extern/nanovg \
|
||||
$(current_dir)/lib/extern/libretro-common/compat \
|
||||
$(current_dir)/lib/extern/libretro-common/encodings \
|
||||
$(current_dir)/lib/extern/libretro-common/features \
|
||||
$(current_dir)/lib/extern/nxfmtwrapper
|
||||
|
||||
INCLUDES := $(INCLUDES) \
|
||||
$(current_dir)/include \
|
||||
$(current_dir)/lib/extern/fmt/include \
|
||||
$(current_dir)/include/borealis/extern
|
||||
60
lib/borealis/library/include/borealis.hpp
Normal file
60
lib/borealis/library/include/borealis.hpp
Normal file
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019 natinusala
|
||||
Copyright (C) 2019 p-sam
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifndef BOREALIS_RESOURCES
|
||||
#error BOREALIS_RESOURCES define missing
|
||||
#endif
|
||||
#define BOREALIS_ASSET(_str) BOREALIS_RESOURCES _str
|
||||
|
||||
// Library
|
||||
#include <borealis/absolute_layout.hpp>
|
||||
#include <borealis/animations.hpp>
|
||||
#include <borealis/applet_frame.hpp>
|
||||
#include <borealis/application.hpp>
|
||||
#include <borealis/background.hpp>
|
||||
#include <borealis/box_layout.hpp>
|
||||
#include <borealis/button.hpp>
|
||||
#include <borealis/crash_frame.hpp>
|
||||
#include <borealis/dialog.hpp>
|
||||
#include <borealis/dropdown.hpp>
|
||||
#include <borealis/event.hpp>
|
||||
#include <borealis/header.hpp>
|
||||
#include <borealis/i18n.hpp>
|
||||
#include <borealis/image.hpp>
|
||||
#include <borealis/label.hpp>
|
||||
#include <borealis/layer_view.hpp>
|
||||
#include <borealis/list.hpp>
|
||||
#include <borealis/logger.hpp>
|
||||
#include <borealis/material_icon.hpp>
|
||||
#include <borealis/notification_manager.hpp>
|
||||
#include <borealis/popup_frame.hpp>
|
||||
#include <borealis/progress_display.hpp>
|
||||
#include <borealis/progress_spinner.hpp>
|
||||
#include <borealis/rectangle.hpp>
|
||||
#include <borealis/repeating_task.hpp>
|
||||
#include <borealis/sidebar.hpp>
|
||||
#include <borealis/staged_applet_frame.hpp>
|
||||
#include <borealis/style.hpp>
|
||||
#include <borealis/tab_frame.hpp>
|
||||
#include <borealis/table.hpp>
|
||||
#include <borealis/theme.hpp>
|
||||
#include <borealis/thumbnail_frame.hpp>
|
||||
#include <borealis/view.hpp>
|
||||
77
lib/borealis/library/include/borealis/absolute_layout.hpp
Normal file
77
lib/borealis/library/include/borealis/absolute_layout.hpp
Normal file
@@ -0,0 +1,77 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2020 natinusala
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <map>
|
||||
|
||||
#include "borealis/view.hpp"
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
// A "layout" that takes a list of views and takes care of all the plumbing
|
||||
// The user is responsible for calling setBoundaries on all the child views
|
||||
// as well as implementing navigation (getDefaultFocus(), getNextFocus())
|
||||
//
|
||||
// Override layout() and reposition your views here, then call the super method
|
||||
class AbsoluteLayout : public View
|
||||
{
|
||||
// TODO: rewrite some of the base views (AppletFrame, CrashFrame, PopupView...) using AbsoluteLayout
|
||||
|
||||
private:
|
||||
std::vector<View*> children;
|
||||
|
||||
public:
|
||||
~AbsoluteLayout();
|
||||
|
||||
void addView(View* view);
|
||||
|
||||
// Plumbing
|
||||
void draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, Style* style, FrameContext* ctx) override;
|
||||
void layout(NVGcontext* vg, Style* style, FontStash* stash) override;
|
||||
void onWindowSizeChanged() override;
|
||||
void willAppear(bool resetState = false) override;
|
||||
void willDisappear(bool resetState = false) override;
|
||||
};
|
||||
|
||||
// Allows users to define an entirely custom "navigation map"
|
||||
// to define where the focus should go when pressing a navigation
|
||||
// key from a view.
|
||||
// Can be used anywhere a custom navigation map is wanted, not only
|
||||
// in AbsoluteLayout.
|
||||
class NavigationMap
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Call this method from any view's getNextFocus() to use the
|
||||
* navigation map. Returns nullptr if there is no such known route.
|
||||
*/
|
||||
View* getNextFocus(FocusDirection direction, View* currentView);
|
||||
|
||||
/**
|
||||
* Add a route to the map from the two given views
|
||||
* using the given direction
|
||||
*/
|
||||
void add(View* from, FocusDirection direction, View* to);
|
||||
|
||||
private:
|
||||
std::map<std::pair<View*, FocusDirection>, View*> map;
|
||||
};
|
||||
|
||||
} // namespace brls
|
||||
68
lib/borealis/library/include/borealis/actions.hpp
Normal file
68
lib/borealis/library/include/borealis/actions.hpp
Normal file
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2020 WerWolv
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <functional>
|
||||
#include <string>
|
||||
|
||||
#define GLFW_INCLUDE_NONE
|
||||
#include <GLFW/glfw3.h>
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
class View;
|
||||
|
||||
typedef std::function<bool(void)> ActionListener;
|
||||
|
||||
// ZL and ZR do not exist here because GLFW doesn't know them
|
||||
enum class Key
|
||||
{
|
||||
A = GLFW_GAMEPAD_BUTTON_A,
|
||||
B = GLFW_GAMEPAD_BUTTON_B,
|
||||
X = GLFW_GAMEPAD_BUTTON_X,
|
||||
Y = GLFW_GAMEPAD_BUTTON_Y,
|
||||
LSTICK = GLFW_GAMEPAD_BUTTON_LEFT_THUMB,
|
||||
RSTICK = GLFW_GAMEPAD_BUTTON_RIGHT_THUMB,
|
||||
L = GLFW_GAMEPAD_BUTTON_LEFT_BUMPER,
|
||||
R = GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER,
|
||||
PLUS = GLFW_GAMEPAD_BUTTON_START,
|
||||
MINUS = GLFW_GAMEPAD_BUTTON_BACK,
|
||||
DLEFT = GLFW_GAMEPAD_BUTTON_DPAD_LEFT,
|
||||
DUP = GLFW_GAMEPAD_BUTTON_DPAD_UP,
|
||||
DRIGHT = GLFW_GAMEPAD_BUTTON_DPAD_RIGHT,
|
||||
DDOWN = GLFW_GAMEPAD_BUTTON_DPAD_DOWN,
|
||||
};
|
||||
|
||||
struct Action
|
||||
{
|
||||
Key key;
|
||||
|
||||
std::string hintText;
|
||||
bool available;
|
||||
bool hidden;
|
||||
ActionListener actionListener;
|
||||
|
||||
bool operator==(const Key other)
|
||||
{
|
||||
return this->key == other;
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace brls
|
||||
178
lib/borealis/library/include/borealis/animations.hpp
Normal file
178
lib/borealis/library/include/borealis/animations.hpp
Normal file
@@ -0,0 +1,178 @@
|
||||
/* RetroArch - A frontend for libretro.
|
||||
* Borealis, a Nintendo Switch UI Library
|
||||
* Copyright (C) 2014-2017 - Jean-André Santoni
|
||||
* Copyright (C) 2011-2017 - Daniel De Matteis
|
||||
* Copyright (C) 2019 - natinusala
|
||||
Copyright (C) 2019 - p-sam
|
||||
*
|
||||
* RetroArch 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 Found-
|
||||
* ation, either version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* RetroArch 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 RetroArch.
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <functional>
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
typedef float (*easing_cb)(float, float, float, float);
|
||||
typedef std::function<void(void*)> tween_cb;
|
||||
|
||||
enum menu_animation_ctl_state
|
||||
{
|
||||
MENU_ANIMATION_CTL_NONE = 0,
|
||||
MENU_ANIMATION_CTL_DEINIT,
|
||||
MENU_ANIMATION_CTL_CLEAR_ACTIVE,
|
||||
MENU_ANIMATION_CTL_SET_ACTIVE
|
||||
};
|
||||
|
||||
enum menu_animation_easing_type
|
||||
{
|
||||
/* Linear */
|
||||
EASING_LINEAR = 0,
|
||||
/* Quad */
|
||||
EASING_IN_QUAD,
|
||||
EASING_OUT_QUAD,
|
||||
EASING_IN_OUT_QUAD,
|
||||
EASING_OUT_IN_QUAD,
|
||||
/* Cubic */
|
||||
EASING_IN_CUBIC,
|
||||
EASING_OUT_CUBIC,
|
||||
EASING_IN_OUT_CUBIC,
|
||||
EASING_OUT_IN_CUBIC,
|
||||
/* Quart */
|
||||
EASING_IN_QUART,
|
||||
EASING_OUT_QUART,
|
||||
EASING_IN_OUT_QUART,
|
||||
EASING_OUT_IN_QUART,
|
||||
/* Quint */
|
||||
EASING_IN_QUINT,
|
||||
EASING_OUT_QUINT,
|
||||
EASING_IN_OUT_QUINT,
|
||||
EASING_OUT_IN_QUINT,
|
||||
/* Sine */
|
||||
EASING_IN_SINE,
|
||||
EASING_OUT_SINE,
|
||||
EASING_IN_OUT_SINE,
|
||||
EASING_OUT_IN_SINE,
|
||||
/* Expo */
|
||||
EASING_IN_EXPO,
|
||||
EASING_OUT_EXPO,
|
||||
EASING_IN_OUT_EXPO,
|
||||
EASING_OUT_IN_EXPO,
|
||||
/* Circ */
|
||||
EASING_IN_CIRC,
|
||||
EASING_OUT_CIRC,
|
||||
EASING_IN_OUT_CIRC,
|
||||
EASING_OUT_IN_CIRC,
|
||||
/* Bounce */
|
||||
EASING_IN_BOUNCE,
|
||||
EASING_OUT_BOUNCE,
|
||||
EASING_IN_OUT_BOUNCE,
|
||||
EASING_OUT_IN_BOUNCE,
|
||||
|
||||
EASING_LAST
|
||||
};
|
||||
|
||||
/* TODO:
|
||||
* Add a reverse loop ticker for languages
|
||||
* that read right to left */
|
||||
enum menu_animation_ticker_type
|
||||
{
|
||||
TICKER_TYPE_BOUNCE = 0,
|
||||
TICKER_TYPE_LOOP,
|
||||
TICKER_TYPE_LAST
|
||||
};
|
||||
|
||||
typedef uintptr_t menu_animation_ctx_tag;
|
||||
|
||||
typedef struct menu_animation_ctx_subject
|
||||
{
|
||||
size_t count;
|
||||
const void* data;
|
||||
} menu_animation_ctx_subject_t;
|
||||
|
||||
typedef struct menu_animation_ctx_entry
|
||||
{
|
||||
enum menu_animation_easing_type easing_enum;
|
||||
uintptr_t tag;
|
||||
float duration;
|
||||
float target_value;
|
||||
float* subject;
|
||||
tween_cb cb;
|
||||
tween_cb tick;
|
||||
void* userdata;
|
||||
} menu_animation_ctx_entry_t;
|
||||
|
||||
typedef struct menu_animation_ctx_ticker
|
||||
{
|
||||
bool selected;
|
||||
size_t len;
|
||||
uint64_t idx;
|
||||
enum menu_animation_ticker_type type_enum;
|
||||
char* s;
|
||||
const char* str;
|
||||
const char* spacer;
|
||||
} menu_animation_ctx_ticker_t;
|
||||
|
||||
typedef float menu_timer_t;
|
||||
|
||||
typedef struct menu_timer_ctx_entry
|
||||
{
|
||||
float duration;
|
||||
tween_cb cb;
|
||||
tween_cb tick;
|
||||
void* userdata;
|
||||
} menu_timer_ctx_entry_t;
|
||||
|
||||
typedef struct menu_delayed_animation
|
||||
{
|
||||
menu_timer_t timer;
|
||||
menu_animation_ctx_entry_t entry;
|
||||
} menu_delayed_animation_t;
|
||||
|
||||
void menu_timer_start(menu_timer_t* timer, menu_timer_ctx_entry_t* timer_entry);
|
||||
|
||||
void menu_timer_kill(menu_timer_t* timer);
|
||||
|
||||
void menu_animation_init(void);
|
||||
|
||||
void menu_animation_free(void);
|
||||
|
||||
bool menu_animation_update(void);
|
||||
|
||||
bool menu_animation_ticker(menu_animation_ctx_ticker_t* ticker);
|
||||
|
||||
float menu_animation_get_delta_time(void);
|
||||
|
||||
bool menu_animation_is_active(void);
|
||||
|
||||
bool menu_animation_kill_by_tag(menu_animation_ctx_tag* tag);
|
||||
|
||||
void menu_animation_kill_by_subject(menu_animation_ctx_subject_t* subject);
|
||||
|
||||
bool menu_animation_push(menu_animation_ctx_entry_t* entry);
|
||||
|
||||
void menu_animation_push_delayed(unsigned delay, menu_animation_ctx_entry_t* entry);
|
||||
|
||||
bool menu_animation_ctl(enum menu_animation_ctl_state state, void* data);
|
||||
|
||||
uint64_t menu_animation_get_ticker_idx(void);
|
||||
|
||||
uint64_t menu_animation_get_ticker_slow_idx(void);
|
||||
|
||||
void menu_animation_get_highlight(float* gradient_x, float* gradient_y, float* color);
|
||||
|
||||
} // namespace brls
|
||||
96
lib/borealis/library/include/borealis/applet_frame.hpp
Normal file
96
lib/borealis/library/include/borealis/applet_frame.hpp
Normal file
@@ -0,0 +1,96 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019 natinusala
|
||||
Copyright (C) 2019 p-sam
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <borealis/frame_context.hpp>
|
||||
#include <borealis/hint.hpp>
|
||||
#include <borealis/image.hpp>
|
||||
#include <borealis/view.hpp>
|
||||
#include <string>
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
enum class HeaderStyle
|
||||
{
|
||||
REGULAR,
|
||||
POPUP // Only meant for PopupFrames. Using it in other contexts might cause weird behaviour
|
||||
};
|
||||
|
||||
// A Horizon settings-like frame, with header and footer (no sidebar)
|
||||
class AppletFrame : public View
|
||||
{
|
||||
private:
|
||||
std::string title = "";
|
||||
std::string footerText = "";
|
||||
|
||||
std::string subTitleLeft = "", subTitleRight = "";
|
||||
|
||||
View* icon = nullptr;
|
||||
Hint* hint = nullptr;
|
||||
|
||||
View* contentView = nullptr;
|
||||
|
||||
bool slideOut = false;
|
||||
bool slideIn = false;
|
||||
|
||||
ViewAnimation animation;
|
||||
|
||||
protected:
|
||||
HeaderStyle headerStyle = HeaderStyle::REGULAR;
|
||||
|
||||
void layout(NVGcontext* vg, Style* style, FontStash* stash) override;
|
||||
|
||||
unsigned leftPadding = 0;
|
||||
unsigned rightPadding = 0;
|
||||
|
||||
public:
|
||||
AppletFrame(bool padLeft, bool padRight);
|
||||
|
||||
void draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, Style* style, FrameContext* ctx) override;
|
||||
View* getDefaultFocus() override;
|
||||
virtual bool onCancel();
|
||||
void willAppear(bool resetState = false) override;
|
||||
void willDisappear(bool resetState = false) override;
|
||||
void show(std::function<void(void)> cb, bool animate = true, ViewAnimation animation = ViewAnimation::FADE) override;
|
||||
void hide(std::function<void(void)> cb, bool animated = true, ViewAnimation animation = ViewAnimation::FADE) override;
|
||||
void onWindowSizeChanged() override;
|
||||
|
||||
void setTitle(std::string title);
|
||||
void setFooterText(std::string footerText);
|
||||
void setSubtitle(std::string left, std::string right);
|
||||
void setIcon(unsigned char* buffer, size_t bufferSize);
|
||||
void setIcon(std::string imagePath);
|
||||
void setIcon(View* view);
|
||||
virtual void setContentView(View* view);
|
||||
bool hasContentView();
|
||||
void setHeaderStyle(HeaderStyle headerStyle);
|
||||
|
||||
void rebuildHints();
|
||||
|
||||
void setAnimateHint(bool animate)
|
||||
{
|
||||
this->hint->setAnimate(animate);
|
||||
}
|
||||
|
||||
~AppletFrame();
|
||||
};
|
||||
|
||||
} // namespace brls
|
||||
214
lib/borealis/library/include/borealis/application.hpp
Normal file
214
lib/borealis/library/include/borealis/application.hpp
Normal file
@@ -0,0 +1,214 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019-2020 natinusala
|
||||
Copyright (C) 2019 p-sam
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#define GLFW_INCLUDE_NONE
|
||||
#include <GLFW/glfw3.h>
|
||||
#include <nanovg/nanovg.h>
|
||||
|
||||
#include <borealis/animations.hpp>
|
||||
#include <borealis/background.hpp>
|
||||
#include <borealis/frame_context.hpp>
|
||||
#include <borealis/hint.hpp>
|
||||
#include <borealis/label.hpp>
|
||||
#include <borealis/logger.hpp>
|
||||
#include <borealis/notification_manager.hpp>
|
||||
#include <borealis/style.hpp>
|
||||
#include <borealis/task_manager.hpp>
|
||||
#include <borealis/theme.hpp>
|
||||
#include <borealis/view.hpp>
|
||||
#include <map>
|
||||
#include <vector>
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
// The top-right framerate counter
|
||||
class FramerateCounter : public Label
|
||||
{
|
||||
private:
|
||||
retro_time_t lastSecond = 0;
|
||||
unsigned frames = 0;
|
||||
|
||||
public:
|
||||
FramerateCounter();
|
||||
|
||||
void frame(FrameContext* ctx) override;
|
||||
};
|
||||
|
||||
class Application
|
||||
{
|
||||
public:
|
||||
// Init with given style and theme, or use defaults if missing
|
||||
static bool init(std::string title, Style* style = nullptr, LibraryViewsThemeVariantsWrapper* themeVariants = nullptr);
|
||||
|
||||
static bool mainLoop();
|
||||
|
||||
static void setBackground(Background* background);
|
||||
|
||||
/**
|
||||
* Pushes a view on this applications's view stack
|
||||
*
|
||||
* The view will automatically be resized to take
|
||||
* the whole screen and layout() will be called
|
||||
*
|
||||
* The view will gain focus if applicable
|
||||
*/
|
||||
static void pushView(View* view, ViewAnimation animation = ViewAnimation::FADE);
|
||||
|
||||
/**
|
||||
* Pops the last pushed view from the stack
|
||||
* and gives focus back where it was before
|
||||
*/
|
||||
static void popView(
|
||||
ViewAnimation animation = ViewAnimation::FADE, std::function<void(void)> cb = []() {});
|
||||
|
||||
/**
|
||||
* Gives the focus to the given view
|
||||
* or clears the focus if given nullptr
|
||||
*/
|
||||
static void giveFocus(View* view);
|
||||
|
||||
static Style* getStyle();
|
||||
|
||||
static Theme* getTheme();
|
||||
static LibraryViewsThemeVariantsWrapper* getThemeVariantsWrapper();
|
||||
static ThemeVariant getThemeVariant();
|
||||
|
||||
static int loadFont(const char* fontName, const char* filePath);
|
||||
static int loadFontFromMemory(const char* fontName, void* data, size_t size, bool freeData);
|
||||
static int findFont(const char* fontName);
|
||||
|
||||
static FontStash* getFontStash();
|
||||
|
||||
static void notify(std::string text);
|
||||
|
||||
static void onGamepadButtonPressed(char button, bool repeating);
|
||||
|
||||
/**
|
||||
* "Crashes" the app (displays a fullscreen CrashFrame)
|
||||
*/
|
||||
static void crash(std::string text);
|
||||
|
||||
static void quit();
|
||||
|
||||
/**
|
||||
* Blocks any and all user inputs
|
||||
*/
|
||||
static void blockInputs();
|
||||
|
||||
/**
|
||||
* Unblocks inputs after a call to
|
||||
* blockInputs()
|
||||
*/
|
||||
static void unblockInputs();
|
||||
|
||||
static NVGcontext* getNVGContext();
|
||||
static TaskManager* getTaskManager();
|
||||
static NotificationManager* getNotificationManager();
|
||||
|
||||
static void setCommonFooter(std::string footer);
|
||||
static std::string* getCommonFooter();
|
||||
|
||||
static void setDisplayFramerate(bool enabled);
|
||||
static void toggleFramerateDisplay();
|
||||
|
||||
static void setMaximumFPS(unsigned fps);
|
||||
|
||||
// public so that the glfw callback can access it
|
||||
inline static unsigned contentWidth, contentHeight;
|
||||
inline static float windowScale;
|
||||
|
||||
static void resizeFramerateCounter();
|
||||
static void resizeNotificationManager();
|
||||
|
||||
static GenericEvent* getGlobalFocusChangeEvent();
|
||||
static VoidEvent* getGlobalHintsUpdateEvent();
|
||||
|
||||
static View* getCurrentFocus();
|
||||
|
||||
static std::string getTitle();
|
||||
|
||||
/**
|
||||
* Cleans up GL state after nanovg
|
||||
* So that we can draw regular stuff over it
|
||||
*/
|
||||
static void cleanupNvgGlState();
|
||||
|
||||
private:
|
||||
inline static bool focusLocked = false;
|
||||
|
||||
inline static GLFWwindow* window;
|
||||
inline static NVGcontext* vg;
|
||||
|
||||
inline static std::string title;
|
||||
|
||||
inline static Background* background = nullptr;
|
||||
|
||||
inline static TaskManager* taskManager;
|
||||
inline static NotificationManager* notificationManager;
|
||||
|
||||
inline static FontStash fontStash;
|
||||
|
||||
inline static std::vector<View*> viewStack;
|
||||
inline static std::vector<View*> focusStack;
|
||||
|
||||
inline static unsigned windowWidth, windowHeight;
|
||||
|
||||
inline static View* currentFocus;
|
||||
|
||||
inline static LibraryViewsThemeVariantsWrapper* currentThemeVariantsWrapper;
|
||||
inline static ThemeVariant currentThemeVariant;
|
||||
|
||||
inline static GLFWgamepadstate oldGamepad;
|
||||
inline static GLFWgamepadstate gamepad;
|
||||
|
||||
inline static Style* currentStyle;
|
||||
|
||||
inline static unsigned blockInputsTokens = 0; // any value > 0 means inputs are blocked
|
||||
|
||||
inline static std::string commonFooter = "";
|
||||
|
||||
inline static FramerateCounter* framerateCounter = nullptr;
|
||||
|
||||
inline static float frameTime = 0.0f;
|
||||
|
||||
inline static View* repetitionOldFocus = nullptr;
|
||||
|
||||
inline static GenericEvent globalFocusChangeEvent;
|
||||
inline static VoidEvent globalHintsUpdateEvent;
|
||||
|
||||
static void navigate(FocusDirection direction);
|
||||
|
||||
static void onWindowSizeChanged();
|
||||
|
||||
static void frame();
|
||||
static void clear();
|
||||
static void exit();
|
||||
|
||||
/**
|
||||
* Handles actions for the currently focused view and
|
||||
* the given button
|
||||
* Returns true if at least one action has been fired
|
||||
*/
|
||||
static bool handleAction(char button);
|
||||
};
|
||||
|
||||
} // namespace brls
|
||||
43
lib/borealis/library/include/borealis/background.hpp
Normal file
43
lib/borealis/library/include/borealis/background.hpp
Normal file
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2020 natinusala
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <borealis/view.hpp>
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
// A special kind of view that has additional callbacks around
|
||||
// the application frame() method (before and after the nanovg frame)
|
||||
// An application can only have one background
|
||||
class Background : public View
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Called before the nanovg frame starts
|
||||
*/
|
||||
virtual void preFrame() = 0;
|
||||
|
||||
/**
|
||||
* Called after the end of the nanovg frame
|
||||
*/
|
||||
virtual void postFrame() = 0;
|
||||
};
|
||||
|
||||
} // namespace brls
|
||||
173
lib/borealis/library/include/borealis/box_layout.hpp
Normal file
173
lib/borealis/library/include/borealis/box_layout.hpp
Normal file
@@ -0,0 +1,173 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019 natinusala
|
||||
Copyright (C) 2019 WerWolv
|
||||
Copyright (C) 2019 p-sam
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <borealis/view.hpp>
|
||||
#include <vector>
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
enum class BoxLayoutOrientation
|
||||
{
|
||||
VERTICAL,
|
||||
HORIZONTAL
|
||||
};
|
||||
|
||||
// TODO: Implement all gravity options for both orientations
|
||||
enum class BoxLayoutGravity
|
||||
{
|
||||
DEFAULT, // left for horizontal, top for vertical
|
||||
LEFT,
|
||||
RIGHT,
|
||||
TOP,
|
||||
BOTTOM,
|
||||
CENTER
|
||||
};
|
||||
|
||||
class BoxLayoutChild
|
||||
{
|
||||
public:
|
||||
View* view;
|
||||
bool fill; // should the child fill the remaining space?
|
||||
};
|
||||
|
||||
// A basic horizontal or vertical box layout :
|
||||
// - Children can currently only be stretched to full width (vertical) or height (horizontal)
|
||||
// - Only works with children with fixed width (horizontal) or height (vertical)
|
||||
|
||||
// TODO: More complex alignment and/or stretching parameters to children
|
||||
class BoxLayout : public View
|
||||
{
|
||||
private:
|
||||
BoxLayoutOrientation orientation;
|
||||
|
||||
unsigned spacing = 0;
|
||||
|
||||
bool resize = false; // should the view be resized according to children size after a layout?
|
||||
|
||||
BoxLayoutGravity gravity = BoxLayoutGravity::DEFAULT;
|
||||
|
||||
protected:
|
||||
std::vector<BoxLayoutChild*> children;
|
||||
|
||||
size_t originalDefaultFocus = 0;
|
||||
size_t defaultFocusedIndex = 0;
|
||||
bool childFocused = false;
|
||||
|
||||
bool rememberFocus = false;
|
||||
|
||||
unsigned marginTop = 0;
|
||||
unsigned marginRight = 0;
|
||||
unsigned marginBottom = 0;
|
||||
unsigned marginLeft = 0;
|
||||
|
||||
/**
|
||||
* Should the BoxLayout apply spacing after
|
||||
* this view?
|
||||
*/
|
||||
virtual void customSpacing(View* current, View* next, int* spacing) { }
|
||||
|
||||
public:
|
||||
BoxLayout(BoxLayoutOrientation orientation, size_t defaultFocus = 0);
|
||||
~BoxLayout();
|
||||
|
||||
void layout(NVGcontext* vg, Style* style, FontStash* stash) override;
|
||||
void draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, Style* style, FrameContext* ctx) override;
|
||||
View* getNextFocus(FocusDirection direction, View* currentView) override;
|
||||
View* getDefaultFocus() override;
|
||||
void onChildFocusGained(View* child) override;
|
||||
void onChildFocusLost(View* child) override;
|
||||
void willAppear(bool resetState = false) override;
|
||||
void willDisappear(bool resetState = false) override;
|
||||
void onWindowSizeChanged() override;
|
||||
|
||||
/**
|
||||
* Sets gravity
|
||||
*/
|
||||
void setGravity(BoxLayoutGravity gravity);
|
||||
|
||||
/**
|
||||
* Sets spacing between views
|
||||
*/
|
||||
void setSpacing(unsigned spacing);
|
||||
unsigned getSpacing();
|
||||
|
||||
/**
|
||||
* Sets margins around views
|
||||
* Bottom (vertical) or right (horizontal) are
|
||||
* only effective if the last child is set to fill
|
||||
*/
|
||||
void setMargins(unsigned top, unsigned right, unsigned bottom, unsigned left);
|
||||
void setMarginBottom(unsigned bottom);
|
||||
|
||||
/**
|
||||
* Adds a view to this box layout
|
||||
* If fill is set to true, the child will
|
||||
* fill the remaining space
|
||||
*/
|
||||
void addView(View* view, bool fill = false, bool resetState = false);
|
||||
|
||||
/**
|
||||
* Removes the view at specified
|
||||
* The view will be freed if free
|
||||
* is set to true (defaults to true)
|
||||
*
|
||||
* Warning: this method isn't correctly
|
||||
* implemented - currently removing a view will
|
||||
* most likely result in memory corruption
|
||||
*/
|
||||
void removeView(int index, bool free = true);
|
||||
|
||||
/**
|
||||
* Removes all views
|
||||
* from this layout
|
||||
*/
|
||||
void clear(bool free = true);
|
||||
|
||||
/**
|
||||
* Returns true if this layout
|
||||
* doesn't contain any views
|
||||
*/
|
||||
bool isEmpty();
|
||||
|
||||
bool isChildFocused();
|
||||
|
||||
void setFocusedIndex(unsigned index);
|
||||
size_t getViewsCount();
|
||||
|
||||
View* getChild(size_t i);
|
||||
|
||||
/**
|
||||
* If enabled, will force the layout to resize itself
|
||||
* to match the children size
|
||||
* Mandatory for using in a ScrollView
|
||||
*/
|
||||
void setResize(bool resize);
|
||||
|
||||
/**
|
||||
* Should the default focus be set to the originally focused
|
||||
* view (until the layout disappears)?
|
||||
*/
|
||||
void setRememberFocus(bool rememberFocus);
|
||||
};
|
||||
|
||||
} // namespace brls
|
||||
100
lib/borealis/library/include/borealis/button.hpp
Normal file
100
lib/borealis/library/include/borealis/button.hpp
Normal file
@@ -0,0 +1,100 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019-2020 natinusala
|
||||
Copyright (C) 2019 p-sam
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <borealis/image.hpp>
|
||||
#include <borealis/label.hpp>
|
||||
#include <borealis/view.hpp>
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
enum class ButtonStyle
|
||||
{
|
||||
PRIMARY = 0, // primary action button (different color than regular, to catch the eye)
|
||||
BORDERED, // text and a border
|
||||
BORDERLESS, // only text
|
||||
CRASH, // same as borderless but with a different text color
|
||||
DIALOG, // same as borderless but with a different text color
|
||||
REGULAR // a regular, plain button
|
||||
};
|
||||
|
||||
enum class ButtonState
|
||||
{
|
||||
ENABLED = 0,
|
||||
DISABLED
|
||||
};
|
||||
|
||||
// A button
|
||||
class Button : public View
|
||||
{
|
||||
private:
|
||||
ButtonStyle style;
|
||||
Label* label = nullptr;
|
||||
Image* image = nullptr;
|
||||
|
||||
GenericEvent clickEvent;
|
||||
|
||||
LabelStyle getLabelStyle();
|
||||
|
||||
ButtonState state = ButtonState::ENABLED;
|
||||
|
||||
float cornerRadiusOverride = 0;
|
||||
|
||||
public:
|
||||
Button(ButtonStyle style = ButtonStyle::PRIMARY);
|
||||
~Button();
|
||||
|
||||
void draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, Style* style, FrameContext* ctx) override;
|
||||
virtual bool onClick();
|
||||
void layout(NVGcontext* vg, Style* style, FontStash* stash);
|
||||
void getHighlightInsets(unsigned* top, unsigned* right, unsigned* bottom, unsigned* left) override;
|
||||
|
||||
ButtonState getState();
|
||||
void setState(ButtonState state);
|
||||
|
||||
Button* setLabel(std::string label);
|
||||
Button* setImage(std::string path);
|
||||
Button* setImage(unsigned char* buffer, size_t bufferSize);
|
||||
|
||||
GenericEvent* getClickEvent();
|
||||
|
||||
View* getDefaultFocus() override
|
||||
{
|
||||
return this;
|
||||
}
|
||||
|
||||
void setCornerRadius(float cornerRadius);
|
||||
|
||||
void getHighlightMetrics(Style* style, float* cornerRadius) override
|
||||
{
|
||||
if (cornerRadiusOverride)
|
||||
*cornerRadius = cornerRadiusOverride;
|
||||
else
|
||||
*cornerRadius = style->Button.cornerRadius;
|
||||
}
|
||||
|
||||
bool isHighlightBackgroundEnabled() override
|
||||
{
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace brls
|
||||
55
lib/borealis/library/include/borealis/crash_frame.hpp
Normal file
55
lib/borealis/library/include/borealis/crash_frame.hpp
Normal file
@@ -0,0 +1,55 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019-2020 natinusala
|
||||
Copyright (C) 2019 p-sam
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <borealis/button.hpp>
|
||||
#include <borealis/hint.hpp>
|
||||
#include <borealis/label.hpp>
|
||||
#include <borealis/view.hpp>
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
// A screen similar to the "The software has closed" dialog
|
||||
// pressing OK will exit the app
|
||||
class CrashFrame : public View
|
||||
{
|
||||
private:
|
||||
Label* label;
|
||||
Button* button;
|
||||
Hint* hint;
|
||||
|
||||
public:
|
||||
CrashFrame(std::string text);
|
||||
|
||||
void draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, Style* style, FrameContext* ctx) override;
|
||||
void layout(NVGcontext* vg, Style* style, FontStash* stash) override;
|
||||
void onShowAnimationEnd() override;
|
||||
View* getDefaultFocus() override;
|
||||
|
||||
bool isTranslucent() override
|
||||
{
|
||||
return true; // have it always translucent to disable fade out animation
|
||||
}
|
||||
|
||||
~CrashFrame();
|
||||
};
|
||||
|
||||
} // namespace brls
|
||||
93
lib/borealis/library/include/borealis/dialog.hpp
Normal file
93
lib/borealis/library/include/borealis/dialog.hpp
Normal file
@@ -0,0 +1,93 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019-2020 natinusala
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <borealis/box_layout.hpp>
|
||||
#include <borealis/view.hpp>
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
// TODO: Add the blurred dialog type once the blur is finished
|
||||
|
||||
class DialogButton
|
||||
{
|
||||
public:
|
||||
std::string label;
|
||||
GenericEvent::Callback cb;
|
||||
};
|
||||
|
||||
// A modal dialog with zero to three buttons
|
||||
// and anything as content
|
||||
// Create the dialog then use open() and close()
|
||||
class Dialog : public View
|
||||
{
|
||||
private:
|
||||
View* contentView = nullptr;
|
||||
|
||||
unsigned frameX, frameY, frameWidth, frameHeight;
|
||||
|
||||
std::vector<DialogButton*> buttons;
|
||||
BoxLayout* verticalButtonsLayout = nullptr;
|
||||
BoxLayout* horizontalButtonsLayout = nullptr;
|
||||
|
||||
void rebuildButtons();
|
||||
|
||||
unsigned getButtonsHeight();
|
||||
|
||||
bool cancelable = true;
|
||||
|
||||
public:
|
||||
Dialog(std::string text);
|
||||
Dialog(View* contentView);
|
||||
~Dialog();
|
||||
|
||||
void draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, Style* style, FrameContext* ctx) override;
|
||||
void layout(NVGcontext* vg, Style* style, FontStash* stash) override;
|
||||
View* getDefaultFocus() override;
|
||||
virtual bool onCancel();
|
||||
|
||||
/**
|
||||
* Adds a button to this dialog, with a maximum of three
|
||||
* The position depends on the add order
|
||||
*
|
||||
* Adding a button after the dialog has been opened is
|
||||
* NOT SUPPORTED
|
||||
*/
|
||||
void addButton(std::string label, GenericEvent::Callback cb);
|
||||
|
||||
/**
|
||||
* A cancelable dialog is closed when
|
||||
* the user presses B (defaults to true)
|
||||
*
|
||||
* A dialog without any buttons cannot
|
||||
* be cancelable
|
||||
*/
|
||||
void setCancelable(bool cancelable);
|
||||
|
||||
void open();
|
||||
void close(std::function<void(void)> cb = []() {});
|
||||
|
||||
bool isTranslucent() override
|
||||
{
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace brls
|
||||
80
lib/borealis/library/include/borealis/dropdown.hpp
Normal file
80
lib/borealis/library/include/borealis/dropdown.hpp
Normal file
@@ -0,0 +1,80 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019-2020 natinusala
|
||||
Copyright (C) 2019-2020 p-sam
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <borealis/event.hpp>
|
||||
#include <borealis/list.hpp>
|
||||
#include <borealis/view.hpp>
|
||||
#include <string>
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
// Fired when the user has selected a value
|
||||
//
|
||||
// Parameter is either the selected value index
|
||||
// or -1 if the user cancelled
|
||||
//
|
||||
// Assume that the Dropdown is deleted
|
||||
// as soon as this function is called
|
||||
typedef Event<int> ValueSelectedEvent;
|
||||
|
||||
// Allows the user to select between multiple
|
||||
// values
|
||||
// Use Dropdown::open()
|
||||
class Dropdown : public View
|
||||
{
|
||||
private:
|
||||
Dropdown(std::string title, std::vector<std::string> values, ValueSelectedEvent::Callback cb, size_t selected = 0);
|
||||
|
||||
std::string title;
|
||||
|
||||
int valuesCount;
|
||||
|
||||
ValueSelectedEvent valueEvent;
|
||||
|
||||
List* list;
|
||||
Hint* hint;
|
||||
|
||||
float topOffset; // for slide in animation
|
||||
|
||||
protected:
|
||||
unsigned getShowAnimationDuration(ViewAnimation animation) override;
|
||||
|
||||
public:
|
||||
~Dropdown();
|
||||
|
||||
void draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, Style* style, FrameContext* ctx) override;
|
||||
void layout(NVGcontext* vg, Style* style, FontStash* stash) override;
|
||||
View* getDefaultFocus() override;
|
||||
virtual bool onCancel();
|
||||
void show(std::function<void(void)> cb, bool animate = true, ViewAnimation animation = ViewAnimation::FADE) override;
|
||||
void willAppear(bool resetState = false) override;
|
||||
void willDisappear(bool resetState = false) override;
|
||||
|
||||
static void open(std::string title, std::vector<std::string> values, ValueSelectedEvent::Callback cb, int selected = -1);
|
||||
|
||||
bool isTranslucent() override
|
||||
{
|
||||
return true || View::isTranslucent();
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace brls
|
||||
75
lib/borealis/library/include/borealis/event.hpp
Normal file
75
lib/borealis/library/include/borealis/event.hpp
Normal file
@@ -0,0 +1,75 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2020 natinusala
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <algorithm>
|
||||
#include <functional>
|
||||
#include <list>
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
// Simple observer pattern implementation
|
||||
//
|
||||
// Usage:
|
||||
// 1. typedef your event type
|
||||
// 2. create as many events as you want using that type
|
||||
// 3. call subscribe on the events with your observers
|
||||
// 4. call fire when you want to fire the events
|
||||
// it wil return true if at least one subscriber exists
|
||||
// for that event
|
||||
template <typename... Ts>
|
||||
class Event
|
||||
{
|
||||
public:
|
||||
typedef std::function<void(Ts...)> Callback;
|
||||
typedef std::list<Callback> CallbacksList;
|
||||
typedef typename CallbacksList::iterator Subscription;
|
||||
|
||||
Subscription subscribe(Callback cb);
|
||||
void unsubscribe(Subscription subscription);
|
||||
bool fire(Ts... args);
|
||||
|
||||
private:
|
||||
CallbacksList callbacks;
|
||||
};
|
||||
|
||||
template <typename... Ts>
|
||||
typename Event<Ts...>::Subscription Event<Ts...>::subscribe(Event<Ts...>::Callback cb)
|
||||
{
|
||||
this->callbacks.push_back(cb);
|
||||
return --this->callbacks.end();
|
||||
}
|
||||
|
||||
template <typename... Ts>
|
||||
void Event<Ts...>::unsubscribe(Event<Ts...>::Subscription subscription)
|
||||
{
|
||||
this->callbacks.erase(subscription);
|
||||
}
|
||||
|
||||
template <typename... Ts>
|
||||
bool Event<Ts...>::fire(Ts... args)
|
||||
{
|
||||
for (Callback cb : this->callbacks)
|
||||
cb(args...);
|
||||
|
||||
return !this->callbacks.empty();
|
||||
}
|
||||
|
||||
}; // namespace brls
|
||||
39
lib/borealis/library/include/borealis/extern/libretro-common/boolean.h
vendored
Normal file
39
lib/borealis/library/include/borealis/extern/libretro-common/boolean.h
vendored
Normal file
@@ -0,0 +1,39 @@
|
||||
/* Copyright (C) 2010-2018 The RetroArch team
|
||||
*
|
||||
* ---------------------------------------------------------------------------------------
|
||||
* The following license statement only applies to this file (boolean.h).
|
||||
* ---------------------------------------------------------------------------------------
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef __LIBRETRO_SDK_BOOLEAN_H
|
||||
#define __LIBRETRO_SDK_BOOLEAN_H
|
||||
|
||||
#ifndef __cplusplus
|
||||
|
||||
#if defined(_MSC_VER) && _MSC_VER < 1800 && !defined(SN_TARGET_PS3)
|
||||
/* Hack applied for MSVC when compiling in C89 mode as it isn't C99 compliant. */
|
||||
#define bool unsigned char
|
||||
#define true 1
|
||||
#define false 0
|
||||
#else
|
||||
#include <stdbool.h>
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
59
lib/borealis/library/include/borealis/extern/libretro-common/compat/strl.h
vendored
Normal file
59
lib/borealis/library/include/borealis/extern/libretro-common/compat/strl.h
vendored
Normal file
@@ -0,0 +1,59 @@
|
||||
/* Copyright (C) 2010-2018 The RetroArch team
|
||||
*
|
||||
* ---------------------------------------------------------------------------------------
|
||||
* The following license statement only applies to this file (strl.h).
|
||||
* ---------------------------------------------------------------------------------------
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef __LIBRETRO_SDK_COMPAT_STRL_H
|
||||
#define __LIBRETRO_SDK_COMPAT_STRL_H
|
||||
|
||||
#include <string.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#if defined(RARCH_INTERNAL) && defined(HAVE_CONFIG_H)
|
||||
#include "../../../config.h"
|
||||
#endif
|
||||
|
||||
#include <libretro-common/retro_common_api.h>
|
||||
|
||||
RETRO_BEGIN_DECLS
|
||||
|
||||
#ifdef __MACH__
|
||||
#ifndef HAVE_STRL
|
||||
#define HAVE_STRL
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_STRL
|
||||
/* Avoid possible naming collisions during link since
|
||||
* we prefer to use the actual name. */
|
||||
#define strlcpy(dst, src, size) strlcpy_retro__(dst, src, size)
|
||||
|
||||
#define strlcat(dst, src, size) strlcat_retro__(dst, src, size)
|
||||
|
||||
size_t strlcpy(char *dest, const char *source, size_t size);
|
||||
size_t strlcat(char *dest, const char *source, size_t size);
|
||||
|
||||
#endif
|
||||
|
||||
char *strldup(const char *s, size_t n);
|
||||
|
||||
RETRO_END_DECLS
|
||||
|
||||
#endif
|
||||
67
lib/borealis/library/include/borealis/extern/libretro-common/encodings/utf.h
vendored
Normal file
67
lib/borealis/library/include/borealis/extern/libretro-common/encodings/utf.h
vendored
Normal file
@@ -0,0 +1,67 @@
|
||||
/* Copyright (C) 2010-2018 The RetroArch team
|
||||
*
|
||||
* ---------------------------------------------------------------------------------------
|
||||
* The following license statement only applies to this file (utf.h).
|
||||
* ---------------------------------------------------------------------------------------
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef _LIBRETRO_ENCODINGS_UTF_H
|
||||
#define _LIBRETRO_ENCODINGS_UTF_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#include <libretro-common/boolean.h>
|
||||
|
||||
#include <libretro-common/retro_common_api.h>
|
||||
|
||||
RETRO_BEGIN_DECLS
|
||||
|
||||
enum CodePage
|
||||
{
|
||||
CODEPAGE_LOCAL = 0, /* CP_ACP */
|
||||
CODEPAGE_UTF8 = 65001 /* CP_UTF8 */
|
||||
};
|
||||
|
||||
size_t utf8_conv_utf32(uint32_t *out, size_t out_chars,
|
||||
const char *in, size_t in_size);
|
||||
|
||||
bool utf16_conv_utf8(uint8_t *out, size_t *out_chars,
|
||||
const uint16_t *in, size_t in_size);
|
||||
|
||||
size_t utf8len(const char *string);
|
||||
|
||||
size_t utf8cpy(char *d, size_t d_len, const char *s, size_t chars);
|
||||
|
||||
const char *utf8skip(const char *str, size_t chars);
|
||||
|
||||
uint32_t utf8_walk(const char **string);
|
||||
|
||||
bool utf16_to_char_string(const uint16_t *in, char *s, size_t len);
|
||||
|
||||
char* utf8_to_local_string_alloc(const char *str);
|
||||
|
||||
char* local_to_utf8_string_alloc(const char *str);
|
||||
|
||||
wchar_t* utf8_to_utf16_string_alloc(const char *str);
|
||||
|
||||
char* utf16_to_utf8_string_alloc(const wchar_t *str);
|
||||
|
||||
RETRO_END_DECLS
|
||||
|
||||
#endif
|
||||
75
lib/borealis/library/include/borealis/extern/libretro-common/features/features_cpu.h
vendored
Normal file
75
lib/borealis/library/include/borealis/extern/libretro-common/features/features_cpu.h
vendored
Normal file
@@ -0,0 +1,75 @@
|
||||
/* Copyright (C) 2010-2018 The RetroArch team
|
||||
*
|
||||
* ---------------------------------------------------------------------------------------
|
||||
* The following license statement only applies to this file (features_cpu.h).
|
||||
* ---------------------------------------------------------------------------------------
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef _LIBRETRO_SDK_CPU_INFO_H
|
||||
#define _LIBRETRO_SDK_CPU_INFO_H
|
||||
|
||||
#include <libretro-common/retro_common_api.h>
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include <libretro-common/libretro.h>
|
||||
|
||||
RETRO_BEGIN_DECLS
|
||||
|
||||
/**
|
||||
* cpu_features_get_perf_counter:
|
||||
*
|
||||
* Gets performance counter.
|
||||
*
|
||||
* Returns: performance counter.
|
||||
**/
|
||||
retro_perf_tick_t cpu_features_get_perf_counter(void);
|
||||
|
||||
/**
|
||||
* cpu_features_get_time_usec:
|
||||
*
|
||||
* Gets time in microseconds, from an undefined epoch.
|
||||
* The epoch may change between computers or across reboots.
|
||||
*
|
||||
* Returns: time in microseconds
|
||||
**/
|
||||
retro_time_t cpu_features_get_time_usec(void);
|
||||
|
||||
/**
|
||||
* cpu_features_get:
|
||||
*
|
||||
* Gets CPU features.
|
||||
*
|
||||
* Returns: bitmask of all CPU features available.
|
||||
**/
|
||||
uint64_t cpu_features_get(void);
|
||||
|
||||
/**
|
||||
* cpu_features_get_core_amount:
|
||||
*
|
||||
* Gets the amount of available CPU cores.
|
||||
*
|
||||
* Returns: amount of CPU cores available.
|
||||
**/
|
||||
unsigned cpu_features_get_core_amount(void);
|
||||
|
||||
void cpu_features_get_model_name(char *name, int len);
|
||||
|
||||
RETRO_END_DECLS
|
||||
|
||||
#endif
|
||||
2537
lib/borealis/library/include/borealis/extern/libretro-common/libretro.h
vendored
Normal file
2537
lib/borealis/library/include/borealis/extern/libretro-common/libretro.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
37
lib/borealis/library/include/borealis/extern/libretro-common/retro_assert.h
vendored
Normal file
37
lib/borealis/library/include/borealis/extern/libretro-common/retro_assert.h
vendored
Normal file
@@ -0,0 +1,37 @@
|
||||
/* Copyright (C) 2010-2018 The RetroArch team
|
||||
*
|
||||
* ---------------------------------------------------------------------------------------
|
||||
* The following license statement only applies to this file (retro_assert.h).
|
||||
* ---------------------------------------------------------------------------------------
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef __RETRO_ASSERT_H
|
||||
#define __RETRO_ASSERT_H
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#ifdef RARCH_INTERNAL
|
||||
#include <stdio.h>
|
||||
#define retro_assert(cond) do { \
|
||||
if (!(cond)) { printf("Assertion failed at %s:%d.\n", __FILE__, __LINE__); abort(); } \
|
||||
} while(0)
|
||||
#else
|
||||
#define retro_assert(cond) assert(cond)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
117
lib/borealis/library/include/borealis/extern/libretro-common/retro_common_api.h
vendored
Normal file
117
lib/borealis/library/include/borealis/extern/libretro-common/retro_common_api.h
vendored
Normal file
@@ -0,0 +1,117 @@
|
||||
/* Copyright (C) 2010-2018 The RetroArch team
|
||||
*
|
||||
* ---------------------------------------------------------------------------------------
|
||||
* The following license statement only applies to this file (retro_common_api.h).
|
||||
* ---------------------------------------------------------------------------------------
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef _LIBRETRO_COMMON_RETRO_COMMON_API_H
|
||||
#define _LIBRETRO_COMMON_RETRO_COMMON_API_H
|
||||
|
||||
/*
|
||||
This file is designed to normalize the libretro-common compiling environment
|
||||
for public API headers. This should be leaner than a normal compiling environment,
|
||||
since it gets #included into other project's sources.
|
||||
*/
|
||||
|
||||
/* ------------------------------------ */
|
||||
|
||||
/*
|
||||
Ordinarily we want to put #ifdef __cplusplus extern "C" in C library
|
||||
headers to enable them to get used by c++ sources.
|
||||
However, we want to support building this library as C++ as well, so a
|
||||
special technique is called for.
|
||||
*/
|
||||
|
||||
#define RETRO_BEGIN_DECLS
|
||||
#define RETRO_END_DECLS
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
#ifdef CXX_BUILD
|
||||
/* build wants everything to be built as c++, so no extern "C" */
|
||||
#else
|
||||
#undef RETRO_BEGIN_DECLS
|
||||
#undef RETRO_END_DECLS
|
||||
#define RETRO_BEGIN_DECLS extern "C" {
|
||||
#define RETRO_END_DECLS }
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
/* header is included by a C source file, so no extern "C" */
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
IMO, this non-standard ssize_t should not be used.
|
||||
However, it's a good example of how to handle something like this.
|
||||
*/
|
||||
#ifdef _MSC_VER
|
||||
#ifndef HAVE_SSIZE_T
|
||||
#define HAVE_SSIZE_T
|
||||
#if defined(_WIN64)
|
||||
typedef __int64 ssize_t;
|
||||
#elif defined(_WIN32)
|
||||
typedef int ssize_t;
|
||||
#endif
|
||||
#endif
|
||||
#elif defined(__MACH__)
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#if _MSC_VER >= 1800
|
||||
#include <inttypes.h>
|
||||
#else
|
||||
#ifndef PRId64
|
||||
#define PRId64 "I64d"
|
||||
#define PRIu64 "I64u"
|
||||
#define PRIuPTR "Iu"
|
||||
#endif
|
||||
#endif
|
||||
#else
|
||||
/* C++11 says this one isn't needed, but apparently (some versions of) mingw require it anyways */
|
||||
/* https://stackoverflow.com/questions/8132399/how-to-printf-uint64-t-fails-with-spurious-trailing-in-format */
|
||||
/* https://github.com/libretro/RetroArch/issues/6009 */
|
||||
#define __STDC_FORMAT_MACROS
|
||||
#include <inttypes.h>
|
||||
#endif
|
||||
#ifndef PRId64
|
||||
#error "inttypes.h is being screwy"
|
||||
#endif
|
||||
#define STRING_REP_INT64 "%" PRId64
|
||||
#define STRING_REP_UINT64 "%" PRIu64
|
||||
#define STRING_REP_USIZE "%" PRIuPTR
|
||||
|
||||
/*
|
||||
I would like to see retro_inline.h moved in here; possibly boolean too.
|
||||
|
||||
rationale: these are used in public APIs, and it is easier to find problems
|
||||
and write code that works the first time portably when theyre included uniformly
|
||||
than to do the analysis from scratch each time you think you need it, for each feature.
|
||||
|
||||
Moreover it helps force you to make hard decisions: if you EVER bring in boolean.h,
|
||||
then you should pay the price everywhere, so you can see how much grief it will cause.
|
||||
|
||||
Of course, another school of thought is that you should do as little damage as possible
|
||||
in as few places as possible...
|
||||
*/
|
||||
|
||||
/* _LIBRETRO_COMMON_RETRO_COMMON_API_H */
|
||||
#endif
|
||||
39
lib/borealis/library/include/borealis/extern/libretro-common/retro_inline.h
vendored
Normal file
39
lib/borealis/library/include/borealis/extern/libretro-common/retro_inline.h
vendored
Normal file
@@ -0,0 +1,39 @@
|
||||
/* Copyright (C) 2010-2018 The RetroArch team
|
||||
*
|
||||
* ---------------------------------------------------------------------------------------
|
||||
* The following license statement only applies to this file (retro_inline.h).
|
||||
* ---------------------------------------------------------------------------------------
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef __LIBRETRO_SDK_INLINE_H
|
||||
#define __LIBRETRO_SDK_INLINE_H
|
||||
|
||||
#ifndef INLINE
|
||||
|
||||
#if defined(_WIN32) || defined(__INTEL_COMPILER)
|
||||
#define INLINE __inline
|
||||
#elif defined(__STDC_VERSION__) && __STDC_VERSION__>=199901L
|
||||
#define INLINE inline
|
||||
#elif defined(__GNUC__)
|
||||
#define INLINE __inline__
|
||||
#else
|
||||
#define INLINE
|
||||
#endif
|
||||
|
||||
#endif
|
||||
#endif
|
||||
94
lib/borealis/library/include/borealis/extern/libretro-common/retro_math.h
vendored
Normal file
94
lib/borealis/library/include/borealis/extern/libretro-common/retro_math.h
vendored
Normal file
@@ -0,0 +1,94 @@
|
||||
/* Copyright (C) 2010-2018 The RetroArch team
|
||||
*
|
||||
* ---------------------------------------------------------------------------------------
|
||||
* The following license statement only applies to this file (retro_math.h).
|
||||
* ---------------------------------------------------------------------------------------
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef _LIBRETRO_COMMON_MATH_H
|
||||
#define _LIBRETRO_COMMON_MATH_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#if defined(_WIN32) && !defined(_XBOX)
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
#elif defined(_WIN32) && defined(_XBOX)
|
||||
#include <Xtl.h>
|
||||
#endif
|
||||
|
||||
#include <limits.h>
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#include <libretro-common/compat/msvc.h>
|
||||
#endif
|
||||
#include <libretro-common/retro_inline.h>
|
||||
|
||||
#ifndef M_PI
|
||||
#if !defined(USE_MATH_DEFINES)
|
||||
#define M_PI 3.14159265358979323846264338327
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef MAX
|
||||
#define MAX(a, b) ((a) > (b) ? (a) : (b))
|
||||
#endif
|
||||
|
||||
#ifndef MIN
|
||||
#define MIN(a, b) ((a) < (b) ? (a) : (b))
|
||||
#endif
|
||||
|
||||
/**
|
||||
* next_pow2:
|
||||
* @v : initial value
|
||||
*
|
||||
* Get next power of 2 value based on initial value.
|
||||
*
|
||||
* Returns: next power of 2 value (derived from @v).
|
||||
**/
|
||||
static INLINE uint32_t next_pow2(uint32_t v)
|
||||
{
|
||||
v--;
|
||||
v |= v >> 1;
|
||||
v |= v >> 2;
|
||||
v |= v >> 4;
|
||||
v |= v >> 8;
|
||||
v |= v >> 16;
|
||||
v++;
|
||||
return v;
|
||||
}
|
||||
|
||||
/**
|
||||
* prev_pow2:
|
||||
* @v : initial value
|
||||
*
|
||||
* Get previous power of 2 value based on initial value.
|
||||
*
|
||||
* Returns: previous power of 2 value (derived from @v).
|
||||
**/
|
||||
static INLINE uint32_t prev_pow2(uint32_t v)
|
||||
{
|
||||
v |= v >> 1;
|
||||
v |= v >> 2;
|
||||
v |= v >> 4;
|
||||
v |= v >> 8;
|
||||
v |= v >> 16;
|
||||
return v - (v >> 1);
|
||||
}
|
||||
|
||||
#endif
|
||||
182
lib/borealis/library/include/borealis/extern/libretro-common/retro_miscellaneous.h
vendored
Normal file
182
lib/borealis/library/include/borealis/extern/libretro-common/retro_miscellaneous.h
vendored
Normal file
@@ -0,0 +1,182 @@
|
||||
/* Copyright (C) 2010-2018 The RetroArch team
|
||||
*
|
||||
* ---------------------------------------------------------------------------------------
|
||||
* The following license statement only applies to this file (retro_miscellaneous.h).
|
||||
* ---------------------------------------------------------------------------------------
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef __RARCH_MISCELLANEOUS_H
|
||||
#define __RARCH_MISCELLANEOUS_H
|
||||
|
||||
#define RARCH_MAX_SUBSYSTEMS 10
|
||||
#define RARCH_MAX_SUBSYSTEM_ROMS 10
|
||||
|
||||
#include <stdint.h>
|
||||
#include <libretro-common/boolean.h>
|
||||
#include <libretro-common/retro_inline.h>
|
||||
|
||||
#if defined(_WIN32) && !defined(_XBOX)
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#elif defined(_WIN32) && defined(_XBOX)
|
||||
#include <Xtl.h>
|
||||
#endif
|
||||
|
||||
#if defined(__CELLOS_LV2__)
|
||||
#include <sys/fs_external.h>
|
||||
#endif
|
||||
|
||||
#include <limits.h>
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#include <libretro-common/compat/msvc.h>
|
||||
#endif
|
||||
|
||||
static INLINE void bits_or_bits(uint32_t *a, uint32_t *b, uint32_t count)
|
||||
{
|
||||
uint32_t i;
|
||||
for (i = 0; i < count;i++)
|
||||
a[i] |= b[i];
|
||||
}
|
||||
|
||||
static INLINE void bits_clear_bits(uint32_t *a, uint32_t *b, uint32_t count)
|
||||
{
|
||||
uint32_t i;
|
||||
for (i = 0; i < count;i++)
|
||||
a[i] &= ~b[i];
|
||||
}
|
||||
|
||||
static INLINE bool bits_any_set(uint32_t* ptr, uint32_t count)
|
||||
{
|
||||
uint32_t i;
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
if (ptr[i] != 0)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
#ifndef PATH_MAX_LENGTH
|
||||
#if defined(__CELLOS_LV2__)
|
||||
#define PATH_MAX_LENGTH CELL_FS_MAX_FS_PATH_LENGTH
|
||||
#elif defined(_XBOX1) || defined(_3DS) || defined(PSP) || defined(PS2) || defined(GEKKO)|| defined(WIIU) || defined(ORBIS)
|
||||
#define PATH_MAX_LENGTH 512
|
||||
#else
|
||||
#define PATH_MAX_LENGTH 4096
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef MAX
|
||||
#define MAX(a, b) ((a) > (b) ? (a) : (b))
|
||||
#endif
|
||||
|
||||
#ifndef MIN
|
||||
#define MIN(a, b) ((a) < (b) ? (a) : (b))
|
||||
#endif
|
||||
|
||||
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
|
||||
|
||||
#define BITS_GET_ELEM(a, i) ((a).data[i])
|
||||
#define BITS_GET_ELEM_PTR(a, i) ((a)->data[i])
|
||||
|
||||
#define BIT_SET(a, bit) ((a)[(bit) >> 3] |= (1 << ((bit) & 7)))
|
||||
#define BIT_CLEAR(a, bit) ((a)[(bit) >> 3] &= ~(1 << ((bit) & 7)))
|
||||
#define BIT_GET(a, bit) (((a)[(bit) >> 3] >> ((bit) & 7)) & 1)
|
||||
|
||||
#define BIT16_SET(a, bit) ((a) |= (1 << ((bit) & 15)))
|
||||
#define BIT16_CLEAR(a, bit) ((a) &= ~(1 << ((bit) & 15)))
|
||||
#define BIT16_GET(a, bit) (((a) >> ((bit) & 15)) & 1)
|
||||
#define BIT16_CLEAR_ALL(a) ((a) = 0)
|
||||
|
||||
#define BIT32_SET(a, bit) ((a) |= (1 << ((bit) & 31)))
|
||||
#define BIT32_CLEAR(a, bit) ((a) &= ~(1 << ((bit) & 31)))
|
||||
#define BIT32_GET(a, bit) (((a) >> ((bit) & 31)) & 1)
|
||||
#define BIT32_CLEAR_ALL(a) ((a) = 0)
|
||||
|
||||
#define BIT64_SET(a, bit) ((a) |= (UINT64_C(1) << ((bit) & 63)))
|
||||
#define BIT64_CLEAR(a, bit) ((a) &= ~(UINT64_C(1) << ((bit) & 63)))
|
||||
#define BIT64_GET(a, bit) (((a) >> ((bit) & 63)) & 1)
|
||||
#define BIT64_CLEAR_ALL(a) ((a) = 0)
|
||||
|
||||
#define BIT128_SET(a, bit) ((a).data[(bit) >> 5] |= (1 << ((bit) & 31)))
|
||||
#define BIT128_CLEAR(a, bit) ((a).data[(bit) >> 5] &= ~(1 << ((bit) & 31)))
|
||||
#define BIT128_GET(a, bit) (((a).data[(bit) >> 5] >> ((bit) & 31)) & 1)
|
||||
#define BIT128_CLEAR_ALL(a) memset(&(a), 0, sizeof(a))
|
||||
|
||||
#define BIT128_SET_PTR(a, bit) BIT128_SET(*a, bit)
|
||||
#define BIT128_CLEAR_PTR(a, bit) BIT128_CLEAR(*a, bit)
|
||||
#define BIT128_GET_PTR(a, bit) BIT128_GET(*a, bit)
|
||||
#define BIT128_CLEAR_ALL_PTR(a) BIT128_CLEAR_ALL(*a)
|
||||
|
||||
#define BIT256_SET(a, bit) BIT128_SET(a, bit)
|
||||
#define BIT256_CLEAR(a, bit) BIT128_CLEAR(a, bit)
|
||||
#define BIT256_GET(a, bit) BIT128_GET(a, bit)
|
||||
#define BIT256_CLEAR_ALL(a) BIT128_CLEAR_ALL(a)
|
||||
|
||||
#define BIT256_SET_PTR(a, bit) BIT256_SET(*a, bit)
|
||||
#define BIT256_CLEAR_PTR(a, bit) BIT256_CLEAR(*a, bit)
|
||||
#define BIT256_GET_PTR(a, bit) BIT256_GET(*a, bit)
|
||||
#define BIT256_CLEAR_ALL_PTR(a) BIT256_CLEAR_ALL(*a)
|
||||
|
||||
#define BITS_COPY16_PTR(a,bits) \
|
||||
{ \
|
||||
BIT128_CLEAR_ALL_PTR(a); \
|
||||
BITS_GET_ELEM_PTR(a, 0) = (bits) & 0xffff; \
|
||||
}
|
||||
|
||||
#define BITS_COPY32_PTR(a,bits) \
|
||||
{ \
|
||||
BIT128_CLEAR_ALL_PTR(a); \
|
||||
BITS_GET_ELEM_PTR(a, 0) = (bits); \
|
||||
}
|
||||
|
||||
/* Helper macros and struct to keep track of many booleans. */
|
||||
/* This struct has 256 bits. */
|
||||
typedef struct
|
||||
{
|
||||
uint32_t data[8];
|
||||
} retro_bits_t;
|
||||
|
||||
#ifdef _WIN32
|
||||
# ifdef _WIN64
|
||||
# define PRI_SIZET PRIu64
|
||||
# else
|
||||
# if _MSC_VER == 1800
|
||||
# define PRI_SIZET PRIu32
|
||||
# else
|
||||
# define PRI_SIZET "u"
|
||||
# endif
|
||||
# endif
|
||||
#elif PS2
|
||||
# define PRI_SIZET "u"
|
||||
#else
|
||||
# if (SIZE_MAX == 0xFFFF)
|
||||
# define PRI_SIZET "hu"
|
||||
# elif (SIZE_MAX == 0xFFFFFFFF)
|
||||
# define PRI_SIZET "u"
|
||||
# elif (SIZE_MAX == 0xFFFFFFFFFFFFFFFF)
|
||||
# define PRI_SIZET "lu"
|
||||
# else
|
||||
# error PRI_SIZET: unknown SIZE_MAX
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#endif
|
||||
116
lib/borealis/library/include/borealis/extern/libretro-common/retro_timers.h
vendored
Normal file
116
lib/borealis/library/include/borealis/extern/libretro-common/retro_timers.h
vendored
Normal file
@@ -0,0 +1,116 @@
|
||||
/* Copyright (C) 2010-2018 The RetroArch team
|
||||
*
|
||||
* ---------------------------------------------------------------------------------------
|
||||
* The following license statement only applies to this file (retro_timers.h).
|
||||
* ---------------------------------------------------------------------------------------
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef __LIBRETRO_COMMON_TIMERS_H
|
||||
#define __LIBRETRO_COMMON_TIMERS_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#if defined(__CELLOS_LV2__) && !defined(__PSL1GHT__)
|
||||
#include <sys/timer.h>
|
||||
#elif defined(XENON)
|
||||
#include <time/time.h>
|
||||
#elif defined(GEKKO) || defined(__PSL1GHT__) || defined(__QNX__)
|
||||
#include <unistd.h>
|
||||
#elif defined(WIIU)
|
||||
#include <wiiu/os/thread.h>
|
||||
#elif defined(PSP)
|
||||
#include <pspthreadman.h>
|
||||
#elif defined(VITA)
|
||||
#include <psp2/kernel/threadmgr.h>
|
||||
#elif defined(PS2)
|
||||
#include <SDL/SDL_timer.h>
|
||||
#elif defined(_3DS)
|
||||
#include <3ds.h>
|
||||
#else
|
||||
#include <time.h>
|
||||
#endif
|
||||
|
||||
#if defined(_WIN32) && !defined(_XBOX)
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
#elif defined(_WIN32) && defined(_XBOX)
|
||||
#include <Xtl.h>
|
||||
#endif
|
||||
|
||||
#include <limits.h>
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#include <libretro-common/compat/msvc.h>
|
||||
#endif
|
||||
#include <libretro-common/retro_inline.h>
|
||||
|
||||
#ifdef DJGPP
|
||||
#define timespec timeval
|
||||
#define tv_nsec tv_usec
|
||||
#include <unistd.h>
|
||||
|
||||
extern int nanosleep(const struct timespec *rqtp, struct timespec *rmtp);
|
||||
|
||||
static int nanosleepDOS(const struct timespec *rqtp, struct timespec *rmtp)
|
||||
{
|
||||
usleep(1000000 * rqtp->tv_sec + rqtp->tv_nsec / 1000);
|
||||
|
||||
if (rmtp)
|
||||
rmtp->tv_sec = rmtp->tv_nsec=0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define nanosleep nanosleepDOS
|
||||
#endif
|
||||
|
||||
/**
|
||||
* retro_sleep:
|
||||
* @msec : amount in milliseconds to sleep
|
||||
*
|
||||
* Sleeps for a specified amount of milliseconds (@msec).
|
||||
**/
|
||||
static INLINE void retro_sleep(unsigned msec)
|
||||
{
|
||||
#if defined(__CELLOS_LV2__) && !defined(__PSL1GHT__)
|
||||
sys_timer_usleep(1000 * msec);
|
||||
#elif defined(PSP) || defined(VITA)
|
||||
sceKernelDelayThread(1000 * msec);
|
||||
#elif defined(PS2)
|
||||
SDL_Delay(msec);
|
||||
#elif defined(_3DS)
|
||||
svcSleepThread(1000000 * (s64)msec);
|
||||
#elif defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
|
||||
SleepEx(msec, FALSE);
|
||||
#elif defined(_WIN32)
|
||||
Sleep(msec);
|
||||
#elif defined(XENON)
|
||||
udelay(1000 * msec);
|
||||
#elif defined(GEKKO) || defined(__PSL1GHT__) || defined(__QNX__)
|
||||
usleep(1000 * msec);
|
||||
#elif defined(WIIU)
|
||||
OSSleepTicks(ms_to_ticks(msec));
|
||||
#else
|
||||
struct timespec tv = {0};
|
||||
tv.tv_sec = msec / 1000;
|
||||
tv.tv_nsec = (msec % 1000) * 1000000;
|
||||
nanosleep(&tv, NULL);
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif
|
||||
111
lib/borealis/library/include/borealis/extern/libretro-common/streams/file_stream.h
vendored
Normal file
111
lib/borealis/library/include/borealis/extern/libretro-common/streams/file_stream.h
vendored
Normal file
@@ -0,0 +1,111 @@
|
||||
/* Copyright (C) 2010-2018 The RetroArch team
|
||||
*
|
||||
* ---------------------------------------------------------------------------------------
|
||||
* The following license statement only applies to this file (file_stream.h).
|
||||
* ---------------------------------------------------------------------------------------
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef __LIBRETRO_SDK_FILE_STREAM_H
|
||||
#define __LIBRETRO_SDK_FILE_STREAM_H
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <libretro-common/libretro.h>
|
||||
#include <libretro-common/retro_common_api.h>
|
||||
#include <libretro-common/retro_inline.h>
|
||||
#include <libretro-common/boolean.h>
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
#define FILESTREAM_REQUIRED_VFS_VERSION 2
|
||||
|
||||
RETRO_BEGIN_DECLS
|
||||
|
||||
typedef struct RFILE RFILE;
|
||||
|
||||
#define FILESTREAM_REQUIRED_VFS_VERSION 2
|
||||
|
||||
void filestream_vfs_init(const struct retro_vfs_interface_info* vfs_info);
|
||||
|
||||
int64_t filestream_get_size(RFILE *stream);
|
||||
|
||||
int64_t filestream_truncate(RFILE *stream, int64_t length);
|
||||
|
||||
/**
|
||||
* filestream_open:
|
||||
* @path : path to file
|
||||
* @mode : file mode to use when opening (read/write)
|
||||
* @bufsize : optional buffer size (-1 or 0 to use default)
|
||||
*
|
||||
* Opens a file for reading or writing, depending on the requested mode.
|
||||
* Returns a pointer to an RFILE if opened successfully, otherwise NULL.
|
||||
**/
|
||||
RFILE *filestream_open(const char *path, unsigned mode, unsigned hints);
|
||||
|
||||
int64_t filestream_seek(RFILE *stream, int64_t offset, int seek_position);
|
||||
|
||||
int64_t filestream_read(RFILE *stream, void *data, int64_t len);
|
||||
|
||||
int64_t filestream_write(RFILE *stream, const void *data, int64_t len);
|
||||
|
||||
int64_t filestream_tell(RFILE *stream);
|
||||
|
||||
void filestream_rewind(RFILE *stream);
|
||||
|
||||
int filestream_close(RFILE *stream);
|
||||
|
||||
int64_t filestream_read_file(const char *path, void **buf, int64_t *len);
|
||||
|
||||
char *filestream_gets(RFILE *stream, char *s, size_t len);
|
||||
|
||||
int filestream_getc(RFILE *stream);
|
||||
|
||||
int filestream_scanf(RFILE *stream, const char* format, ...);
|
||||
|
||||
int filestream_eof(RFILE *stream);
|
||||
|
||||
bool filestream_write_file(const char *path, const void *data, int64_t size);
|
||||
|
||||
int filestream_putc(RFILE *stream, int c);
|
||||
|
||||
int filestream_vprintf(RFILE *stream, const char* format, va_list args);
|
||||
|
||||
int filestream_printf(RFILE *stream, const char* format, ...);
|
||||
|
||||
int filestream_error(RFILE *stream);
|
||||
|
||||
int filestream_flush(RFILE *stream);
|
||||
|
||||
int filestream_delete(const char *path);
|
||||
|
||||
int filestream_rename(const char *old_path, const char *new_path);
|
||||
|
||||
const char *filestream_get_path(RFILE *stream);
|
||||
|
||||
bool filestream_exists(const char *path);
|
||||
|
||||
char *filestream_getline(RFILE *stream);
|
||||
|
||||
RETRO_END_DECLS
|
||||
|
||||
#endif
|
||||
134
lib/borealis/library/include/borealis/extern/libretro-common/string/stdstring.h
vendored
Normal file
134
lib/borealis/library/include/borealis/extern/libretro-common/string/stdstring.h
vendored
Normal file
@@ -0,0 +1,134 @@
|
||||
/* Copyright (C) 2010-2019 The RetroArch team
|
||||
*
|
||||
* ---------------------------------------------------------------------------------------
|
||||
* The following license statement only applies to this file (stdstring.h).
|
||||
* ---------------------------------------------------------------------------------------
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef __LIBRETRO_SDK_STDSTRING_H
|
||||
#define __LIBRETRO_SDK_STDSTRING_H
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
#include <ctype.h>
|
||||
#include <string.h>
|
||||
#include <libretro-common/boolean.h>
|
||||
|
||||
#include <libretro-common/retro_common_api.h>
|
||||
#include <libretro-common/retro_inline.h>
|
||||
#include <libretro-common/compat/strl.h>
|
||||
|
||||
RETRO_BEGIN_DECLS
|
||||
|
||||
static INLINE bool string_is_empty(const char *data)
|
||||
{
|
||||
return !data || (*data == '\0');
|
||||
}
|
||||
|
||||
static INLINE bool string_is_equal(const char *a, const char *b)
|
||||
{
|
||||
return (a && b) ? !strcmp(a, b) : false;
|
||||
}
|
||||
|
||||
#define STRLEN_CONST(x) ((sizeof((x))-1))
|
||||
|
||||
#define string_is_not_equal(a, b) !string_is_equal((a), (b))
|
||||
|
||||
#define string_add_pair_open(s, size) strlcat((s), " (", (size))
|
||||
#define string_add_pair_close(s, size) strlcat((s), ")", (size))
|
||||
#define string_add_bracket_open(s, size) strlcat((s), "{", (size))
|
||||
#define string_add_bracket_close(s, size) strlcat((s), "}", (size))
|
||||
#define string_add_single_quote(s, size) strlcat((s), "'", (size))
|
||||
#define string_add_quote(s, size) strlcat((s), "\"", (size))
|
||||
#define string_add_colon(s, size) strlcat((s), ":", (size))
|
||||
#define string_add_glob_open(s, size) strlcat((s), "glob('*", (size))
|
||||
#define string_add_glob_close(s, size) strlcat((s), "*')", (size))
|
||||
|
||||
#define string_is_not_equal_fast(a, b, size) (memcmp(a, b, size) != 0)
|
||||
#define string_is_equal_fast(a, b, size) (memcmp(a, b, size) == 0)
|
||||
|
||||
static INLINE void string_add_between_pairs(char *s, const char *str,
|
||||
size_t size)
|
||||
{
|
||||
string_add_pair_open(s, size);
|
||||
strlcat(s, str, size);
|
||||
string_add_pair_close(s, size);
|
||||
}
|
||||
|
||||
static INLINE bool string_is_equal_case_insensitive(const char *a,
|
||||
const char *b)
|
||||
{
|
||||
int result = 0;
|
||||
const unsigned char *p1 = (const unsigned char*)a;
|
||||
const unsigned char *p2 = (const unsigned char*)b;
|
||||
|
||||
if (!a || !b)
|
||||
return false;
|
||||
if (p1 == p2)
|
||||
return true;
|
||||
|
||||
while ((result = tolower (*p1) - tolower (*p2++)) == 0)
|
||||
if (*p1++ == '\0')
|
||||
break;
|
||||
|
||||
return (result == 0);
|
||||
}
|
||||
|
||||
static INLINE bool string_is_equal_noncase(const char *a, const char *b)
|
||||
{
|
||||
int result = 0;
|
||||
const unsigned char *p1 = (const unsigned char*)a;
|
||||
const unsigned char *p2 = (const unsigned char*)b;
|
||||
|
||||
if (!a || !b)
|
||||
return false;
|
||||
if (p1 == p2)
|
||||
return false;
|
||||
|
||||
while ((result = tolower (*p1) - tolower (*p2++)) == 0)
|
||||
if (*p1++ == '\0')
|
||||
break;
|
||||
|
||||
return (result == 0);
|
||||
}
|
||||
|
||||
char *string_to_upper(char *s);
|
||||
|
||||
char *string_to_lower(char *s);
|
||||
|
||||
char *string_ucwords(char *s);
|
||||
|
||||
char *string_replace_substring(const char *in, const char *pattern,
|
||||
const char *by);
|
||||
|
||||
/* Remove leading whitespaces */
|
||||
char *string_trim_whitespace_left(char *const s);
|
||||
|
||||
/* Remove trailing whitespaces */
|
||||
char *string_trim_whitespace_right(char *const s);
|
||||
|
||||
/* Remove leading and trailing whitespaces */
|
||||
char *string_trim_whitespace(char *const s);
|
||||
|
||||
/* max_lines == 0 means no limit */
|
||||
char *word_wrap(char *buffer, const char *string,
|
||||
int line_width, bool unicode, unsigned max_lines);
|
||||
|
||||
RETRO_END_DECLS
|
||||
|
||||
#endif
|
||||
18
lib/borealis/library/include/borealis/extern/nanovg/LICENSE.txt
vendored
Normal file
18
lib/borealis/library/include/borealis/extern/nanovg/LICENSE.txt
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
Copyright (c) 2013 Mikko Mononen memon@inside.org
|
||||
|
||||
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.
|
||||
|
||||
1785
lib/borealis/library/include/borealis/extern/nanovg/fontstash.h
vendored
Normal file
1785
lib/borealis/library/include/borealis/extern/nanovg/fontstash.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
697
lib/borealis/library/include/borealis/extern/nanovg/nanovg.h
vendored
Normal file
697
lib/borealis/library/include/borealis/extern/nanovg/nanovg.h
vendored
Normal file
@@ -0,0 +1,697 @@
|
||||
//
|
||||
// Copyright (c) 2013 Mikko Mononen memon@inside.org
|
||||
//
|
||||
// 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 NANOVG_H
|
||||
#define NANOVG_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define NVG_PI 3.14159265358979323846264338327f
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable: 4201) // nonstandard extension used : nameless struct/union
|
||||
#endif
|
||||
|
||||
typedef struct NVGcontext NVGcontext;
|
||||
|
||||
struct NVGcolor {
|
||||
union {
|
||||
float rgba[4];
|
||||
struct {
|
||||
float r,g,b,a;
|
||||
};
|
||||
};
|
||||
};
|
||||
typedef struct NVGcolor NVGcolor;
|
||||
|
||||
struct NVGpaint {
|
||||
float xform[6];
|
||||
float extent[2];
|
||||
float radius;
|
||||
float feather;
|
||||
NVGcolor innerColor;
|
||||
NVGcolor outerColor;
|
||||
int image;
|
||||
};
|
||||
typedef struct NVGpaint NVGpaint;
|
||||
|
||||
enum NVGwinding {
|
||||
NVG_CCW = 1, // Winding for solid shapes
|
||||
NVG_CW = 2, // Winding for holes
|
||||
};
|
||||
|
||||
enum NVGsolidity {
|
||||
NVG_SOLID = 1, // CCW
|
||||
NVG_HOLE = 2, // CW
|
||||
};
|
||||
|
||||
enum NVGlineCap {
|
||||
NVG_BUTT,
|
||||
NVG_ROUND,
|
||||
NVG_SQUARE,
|
||||
NVG_BEVEL,
|
||||
NVG_MITER,
|
||||
};
|
||||
|
||||
enum NVGalign {
|
||||
// Horizontal align
|
||||
NVG_ALIGN_LEFT = 1<<0, // Default, align text horizontally to left.
|
||||
NVG_ALIGN_CENTER = 1<<1, // Align text horizontally to center.
|
||||
NVG_ALIGN_RIGHT = 1<<2, // Align text horizontally to right.
|
||||
// Vertical align
|
||||
NVG_ALIGN_TOP = 1<<3, // Align text vertically to top.
|
||||
NVG_ALIGN_MIDDLE = 1<<4, // Align text vertically to middle.
|
||||
NVG_ALIGN_BOTTOM = 1<<5, // Align text vertically to bottom.
|
||||
NVG_ALIGN_BASELINE = 1<<6, // Default, align text vertically to baseline.
|
||||
};
|
||||
|
||||
enum NVGblendFactor {
|
||||
NVG_ZERO = 1<<0,
|
||||
NVG_ONE = 1<<1,
|
||||
NVG_SRC_COLOR = 1<<2,
|
||||
NVG_ONE_MINUS_SRC_COLOR = 1<<3,
|
||||
NVG_DST_COLOR = 1<<4,
|
||||
NVG_ONE_MINUS_DST_COLOR = 1<<5,
|
||||
NVG_SRC_ALPHA = 1<<6,
|
||||
NVG_ONE_MINUS_SRC_ALPHA = 1<<7,
|
||||
NVG_DST_ALPHA = 1<<8,
|
||||
NVG_ONE_MINUS_DST_ALPHA = 1<<9,
|
||||
NVG_SRC_ALPHA_SATURATE = 1<<10,
|
||||
};
|
||||
|
||||
enum NVGcompositeOperation {
|
||||
NVG_SOURCE_OVER,
|
||||
NVG_SOURCE_IN,
|
||||
NVG_SOURCE_OUT,
|
||||
NVG_ATOP,
|
||||
NVG_DESTINATION_OVER,
|
||||
NVG_DESTINATION_IN,
|
||||
NVG_DESTINATION_OUT,
|
||||
NVG_DESTINATION_ATOP,
|
||||
NVG_LIGHTER,
|
||||
NVG_COPY,
|
||||
NVG_XOR,
|
||||
};
|
||||
|
||||
struct NVGcompositeOperationState {
|
||||
int srcRGB;
|
||||
int dstRGB;
|
||||
int srcAlpha;
|
||||
int dstAlpha;
|
||||
};
|
||||
typedef struct NVGcompositeOperationState NVGcompositeOperationState;
|
||||
|
||||
struct NVGglyphPosition {
|
||||
const char* str; // Position of the glyph in the input string.
|
||||
float x; // The x-coordinate of the logical glyph position.
|
||||
float minx, maxx; // The bounds of the glyph shape.
|
||||
};
|
||||
typedef struct NVGglyphPosition NVGglyphPosition;
|
||||
|
||||
struct NVGtextRow {
|
||||
const char* start; // Pointer to the input text where the row starts.
|
||||
const char* end; // Pointer to the input text where the row ends (one past the last character).
|
||||
const char* next; // Pointer to the beginning of the next row.
|
||||
float width; // Logical width of the row.
|
||||
float minx, maxx; // Actual bounds of the row. Logical with and bounds can differ because of kerning and some parts over extending.
|
||||
};
|
||||
typedef struct NVGtextRow NVGtextRow;
|
||||
|
||||
enum NVGimageFlags {
|
||||
NVG_IMAGE_GENERATE_MIPMAPS = 1<<0, // Generate mipmaps during creation of the image.
|
||||
NVG_IMAGE_REPEATX = 1<<1, // Repeat image in X direction.
|
||||
NVG_IMAGE_REPEATY = 1<<2, // Repeat image in Y direction.
|
||||
NVG_IMAGE_FLIPY = 1<<3, // Flips (inverses) image in Y direction when rendered.
|
||||
NVG_IMAGE_PREMULTIPLIED = 1<<4, // Image data has premultiplied alpha.
|
||||
NVG_IMAGE_NEAREST = 1<<5, // Image interpolation is Nearest instead Linear
|
||||
};
|
||||
|
||||
// Begin drawing a new frame
|
||||
// Calls to nanovg drawing API should be wrapped in nvgBeginFrame() & nvgEndFrame()
|
||||
// nvgBeginFrame() defines the size of the window to render to in relation currently
|
||||
// set viewport (i.e. glViewport on GL backends). Device pixel ration allows to
|
||||
// control the rendering on Hi-DPI devices.
|
||||
// For example, GLFW returns two dimension for an opened window: window size and
|
||||
// frame buffer size. In that case you would set windowWidth/Height to the window size
|
||||
// devicePixelRatio to: frameBufferWidth / windowWidth.
|
||||
void nvgBeginFrame(NVGcontext* ctx, float windowWidth, float windowHeight, float devicePixelRatio);
|
||||
|
||||
// Cancels drawing the current frame.
|
||||
void nvgCancelFrame(NVGcontext* ctx);
|
||||
|
||||
// Ends drawing flushing remaining render state.
|
||||
void nvgEndFrame(NVGcontext* ctx);
|
||||
|
||||
//
|
||||
// Composite operation
|
||||
//
|
||||
// The composite operations in NanoVG are modeled after HTML Canvas API, and
|
||||
// the blend func is based on OpenGL (see corresponding manuals for more info).
|
||||
// The colors in the blending state have premultiplied alpha.
|
||||
|
||||
// Sets the composite operation. The op parameter should be one of NVGcompositeOperation.
|
||||
void nvgGlobalCompositeOperation(NVGcontext* ctx, int op);
|
||||
|
||||
// Sets the composite operation with custom pixel arithmetic. The parameters should be one of NVGblendFactor.
|
||||
void nvgGlobalCompositeBlendFunc(NVGcontext* ctx, int sfactor, int dfactor);
|
||||
|
||||
// Sets the composite operation with custom pixel arithmetic for RGB and alpha components separately. The parameters should be one of NVGblendFactor.
|
||||
void nvgGlobalCompositeBlendFuncSeparate(NVGcontext* ctx, int srcRGB, int dstRGB, int srcAlpha, int dstAlpha);
|
||||
|
||||
//
|
||||
// Color utils
|
||||
//
|
||||
// Colors in NanoVG are stored as unsigned ints in ABGR format.
|
||||
|
||||
// Returns a color value from red, green, blue values. Alpha will be set to 255 (1.0f).
|
||||
NVGcolor nvgRGB(unsigned char r, unsigned char g, unsigned char b);
|
||||
|
||||
// Returns a color value from red, green, blue values. Alpha will be set to 1.0f.
|
||||
NVGcolor nvgRGBf(float r, float g, float b);
|
||||
|
||||
|
||||
// Returns a color value from red, green, blue and alpha values.
|
||||
NVGcolor nvgRGBA(unsigned char r, unsigned char g, unsigned char b, unsigned char a);
|
||||
|
||||
// Returns a color value from red, green, blue and alpha values.
|
||||
NVGcolor nvgRGBAf(float r, float g, float b, float a);
|
||||
|
||||
|
||||
// Linearly interpolates from color c0 to c1, and returns resulting color value.
|
||||
NVGcolor nvgLerpRGBA(NVGcolor c0, NVGcolor c1, float u);
|
||||
|
||||
// Sets transparency of a color value.
|
||||
NVGcolor nvgTransRGBA(NVGcolor c0, unsigned char a);
|
||||
|
||||
// Sets transparency of a color value.
|
||||
NVGcolor nvgTransRGBAf(NVGcolor c0, float a);
|
||||
|
||||
// Returns color value specified by hue, saturation and lightness.
|
||||
// HSL values are all in range [0..1], alpha will be set to 255.
|
||||
NVGcolor nvgHSL(float h, float s, float l);
|
||||
|
||||
// Returns color value specified by hue, saturation and lightness and alpha.
|
||||
// HSL values are all in range [0..1], alpha in range [0..255]
|
||||
NVGcolor nvgHSLA(float h, float s, float l, unsigned char a);
|
||||
|
||||
//
|
||||
// State Handling
|
||||
//
|
||||
// NanoVG contains state which represents how paths will be rendered.
|
||||
// The state contains transform, fill and stroke styles, text and font styles,
|
||||
// and scissor clipping.
|
||||
|
||||
// Pushes and saves the current render state into a state stack.
|
||||
// A matching nvgRestore() must be used to restore the state.
|
||||
void nvgSave(NVGcontext* ctx);
|
||||
|
||||
// Pops and restores current render state.
|
||||
void nvgRestore(NVGcontext* ctx);
|
||||
|
||||
// Resets current render state to default values. Does not affect the render state stack.
|
||||
void nvgReset(NVGcontext* ctx);
|
||||
|
||||
//
|
||||
// Render styles
|
||||
//
|
||||
// Fill and stroke render style can be either a solid color or a paint which is a gradient or a pattern.
|
||||
// Solid color is simply defined as a color value, different kinds of paints can be created
|
||||
// using nvgLinearGradient(), nvgBoxGradient(), nvgRadialGradient() and nvgImagePattern().
|
||||
//
|
||||
// Current render style can be saved and restored using nvgSave() and nvgRestore().
|
||||
|
||||
// Sets whether to draw antialias for nvgStroke() and nvgFill(). It's enabled by default.
|
||||
void nvgShapeAntiAlias(NVGcontext* ctx, int enabled);
|
||||
|
||||
// Sets current stroke style to a solid color.
|
||||
void nvgStrokeColor(NVGcontext* ctx, NVGcolor color);
|
||||
|
||||
// Sets current stroke style to a paint, which can be a one of the gradients or a pattern.
|
||||
void nvgStrokePaint(NVGcontext* ctx, NVGpaint paint);
|
||||
|
||||
// Sets current fill style to a solid color.
|
||||
void nvgFillColor(NVGcontext* ctx, NVGcolor color);
|
||||
|
||||
// Sets current fill style to a paint, which can be a one of the gradients or a pattern.
|
||||
void nvgFillPaint(NVGcontext* ctx, NVGpaint paint);
|
||||
|
||||
// Sets the miter limit of the stroke style.
|
||||
// Miter limit controls when a sharp corner is beveled.
|
||||
void nvgMiterLimit(NVGcontext* ctx, float limit);
|
||||
|
||||
// Sets the stroke width of the stroke style.
|
||||
void nvgStrokeWidth(NVGcontext* ctx, float size);
|
||||
|
||||
// Sets how the end of the line (cap) is drawn,
|
||||
// Can be one of: NVG_BUTT (default), NVG_ROUND, NVG_SQUARE.
|
||||
void nvgLineCap(NVGcontext* ctx, int cap);
|
||||
|
||||
// Sets how sharp path corners are drawn.
|
||||
// Can be one of NVG_MITER (default), NVG_ROUND, NVG_BEVEL.
|
||||
void nvgLineJoin(NVGcontext* ctx, int join);
|
||||
|
||||
// Sets the transparency applied to all rendered shapes.
|
||||
// Already transparent paths will get proportionally more transparent as well.
|
||||
void nvgGlobalAlpha(NVGcontext* ctx, float alpha);
|
||||
|
||||
//
|
||||
// Transforms
|
||||
//
|
||||
// The paths, gradients, patterns and scissor region are transformed by an transformation
|
||||
// matrix at the time when they are passed to the API.
|
||||
// The current transformation matrix is a affine matrix:
|
||||
// [sx kx tx]
|
||||
// [ky sy ty]
|
||||
// [ 0 0 1]
|
||||
// Where: sx,sy define scaling, kx,ky skewing, and tx,ty translation.
|
||||
// The last row is assumed to be 0,0,1 and is not stored.
|
||||
//
|
||||
// Apart from nvgResetTransform(), each transformation function first creates
|
||||
// specific transformation matrix and pre-multiplies the current transformation by it.
|
||||
//
|
||||
// Current coordinate system (transformation) can be saved and restored using nvgSave() and nvgRestore().
|
||||
|
||||
// Resets current transform to a identity matrix.
|
||||
void nvgResetTransform(NVGcontext* ctx);
|
||||
|
||||
// Premultiplies current coordinate system by specified matrix.
|
||||
// The parameters are interpreted as matrix as follows:
|
||||
// [a c e]
|
||||
// [b d f]
|
||||
// [0 0 1]
|
||||
void nvgTransform(NVGcontext* ctx, float a, float b, float c, float d, float e, float f);
|
||||
|
||||
// Translates current coordinate system.
|
||||
void nvgTranslate(NVGcontext* ctx, float x, float y);
|
||||
|
||||
// Rotates current coordinate system. Angle is specified in radians.
|
||||
void nvgRotate(NVGcontext* ctx, float angle);
|
||||
|
||||
// Skews the current coordinate system along X axis. Angle is specified in radians.
|
||||
void nvgSkewX(NVGcontext* ctx, float angle);
|
||||
|
||||
// Skews the current coordinate system along Y axis. Angle is specified in radians.
|
||||
void nvgSkewY(NVGcontext* ctx, float angle);
|
||||
|
||||
// Scales the current coordinate system.
|
||||
void nvgScale(NVGcontext* ctx, float x, float y);
|
||||
|
||||
// Stores the top part (a-f) of the current transformation matrix in to the specified buffer.
|
||||
// [a c e]
|
||||
// [b d f]
|
||||
// [0 0 1]
|
||||
// There should be space for 6 floats in the return buffer for the values a-f.
|
||||
void nvgCurrentTransform(NVGcontext* ctx, float* xform);
|
||||
|
||||
|
||||
// The following functions can be used to make calculations on 2x3 transformation matrices.
|
||||
// A 2x3 matrix is represented as float[6].
|
||||
|
||||
// Sets the transform to identity matrix.
|
||||
void nvgTransformIdentity(float* dst);
|
||||
|
||||
// Sets the transform to translation matrix matrix.
|
||||
void nvgTransformTranslate(float* dst, float tx, float ty);
|
||||
|
||||
// Sets the transform to scale matrix.
|
||||
void nvgTransformScale(float* dst, float sx, float sy);
|
||||
|
||||
// Sets the transform to rotate matrix. Angle is specified in radians.
|
||||
void nvgTransformRotate(float* dst, float a);
|
||||
|
||||
// Sets the transform to skew-x matrix. Angle is specified in radians.
|
||||
void nvgTransformSkewX(float* dst, float a);
|
||||
|
||||
// Sets the transform to skew-y matrix. Angle is specified in radians.
|
||||
void nvgTransformSkewY(float* dst, float a);
|
||||
|
||||
// Sets the transform to the result of multiplication of two transforms, of A = A*B.
|
||||
void nvgTransformMultiply(float* dst, const float* src);
|
||||
|
||||
// Sets the transform to the result of multiplication of two transforms, of A = B*A.
|
||||
void nvgTransformPremultiply(float* dst, const float* src);
|
||||
|
||||
// Sets the destination to inverse of specified transform.
|
||||
// Returns 1 if the inverse could be calculated, else 0.
|
||||
int nvgTransformInverse(float* dst, const float* src);
|
||||
|
||||
// Transform a point by given transform.
|
||||
void nvgTransformPoint(float* dstx, float* dsty, const float* xform, float srcx, float srcy);
|
||||
|
||||
// Converts degrees to radians and vice versa.
|
||||
float nvgDegToRad(float deg);
|
||||
float nvgRadToDeg(float rad);
|
||||
|
||||
//
|
||||
// Images
|
||||
//
|
||||
// NanoVG allows you to load jpg, png, psd, tga, pic and gif files to be used for rendering.
|
||||
// In addition you can upload your own image. The image loading is provided by stb_image.
|
||||
// The parameter imageFlags is combination of flags defined in NVGimageFlags.
|
||||
|
||||
// Creates image by loading it from the disk from specified file name.
|
||||
// Returns handle to the image.
|
||||
int nvgCreateImage(NVGcontext* ctx, const char* filename, int imageFlags);
|
||||
|
||||
// Creates image by loading it from the specified chunk of memory.
|
||||
// Returns handle to the image.
|
||||
int nvgCreateImageMem(NVGcontext* ctx, int imageFlags, unsigned char* data, int ndata);
|
||||
|
||||
// Creates image from specified image data.
|
||||
// Returns handle to the image.
|
||||
int nvgCreateImageRGBA(NVGcontext* ctx, int w, int h, int imageFlags, const unsigned char* data);
|
||||
|
||||
// Updates image data specified by image handle.
|
||||
void nvgUpdateImage(NVGcontext* ctx, int image, const unsigned char* data);
|
||||
|
||||
// Returns the dimensions of a created image.
|
||||
void nvgImageSize(NVGcontext* ctx, int image, int* w, int* h);
|
||||
|
||||
// Deletes created image.
|
||||
void nvgDeleteImage(NVGcontext* ctx, int image);
|
||||
|
||||
//
|
||||
// Paints
|
||||
//
|
||||
// NanoVG supports four types of paints: linear gradient, box gradient, radial gradient and image pattern.
|
||||
// These can be used as paints for strokes and fills.
|
||||
|
||||
// Creates and returns a linear gradient. Parameters (sx,sy)-(ex,ey) specify the start and end coordinates
|
||||
// of the linear gradient, icol specifies the start color and ocol the end color.
|
||||
// The gradient is transformed by the current transform when it is passed to nvgFillPaint() or nvgStrokePaint().
|
||||
NVGpaint nvgLinearGradient(NVGcontext* ctx, float sx, float sy, float ex, float ey,
|
||||
NVGcolor icol, NVGcolor ocol);
|
||||
|
||||
// Creates and returns a box gradient. Box gradient is a feathered rounded rectangle, it is useful for rendering
|
||||
// drop shadows or highlights for boxes. Parameters (x,y) define the top-left corner of the rectangle,
|
||||
// (w,h) define the size of the rectangle, r defines the corner radius, and f feather. Feather defines how blurry
|
||||
// the border of the rectangle is. Parameter icol specifies the inner color and ocol the outer color of the gradient.
|
||||
// The gradient is transformed by the current transform when it is passed to nvgFillPaint() or nvgStrokePaint().
|
||||
NVGpaint nvgBoxGradient(NVGcontext* ctx, float x, float y, float w, float h,
|
||||
float r, float f, NVGcolor icol, NVGcolor ocol);
|
||||
|
||||
// Creates and returns a radial gradient. Parameters (cx,cy) specify the center, inr and outr specify
|
||||
// the inner and outer radius of the gradient, icol specifies the start color and ocol the end color.
|
||||
// The gradient is transformed by the current transform when it is passed to nvgFillPaint() or nvgStrokePaint().
|
||||
NVGpaint nvgRadialGradient(NVGcontext* ctx, float cx, float cy, float inr, float outr,
|
||||
NVGcolor icol, NVGcolor ocol);
|
||||
|
||||
// Creates and returns an image pattern. Parameters (ox,oy) specify the left-top location of the image pattern,
|
||||
// (ex,ey) the size of one image, angle rotation around the top-left corner, image is handle to the image to render.
|
||||
// The gradient is transformed by the current transform when it is passed to nvgFillPaint() or nvgStrokePaint().
|
||||
NVGpaint nvgImagePattern(NVGcontext* ctx, float ox, float oy, float ex, float ey,
|
||||
float angle, int image, float alpha);
|
||||
|
||||
//
|
||||
// Scissoring
|
||||
//
|
||||
// Scissoring allows you to clip the rendering into a rectangle. This is useful for various
|
||||
// user interface cases like rendering a text edit or a timeline.
|
||||
|
||||
// Sets the current scissor rectangle.
|
||||
// The scissor rectangle is transformed by the current transform.
|
||||
void nvgScissor(NVGcontext* ctx, float x, float y, float w, float h);
|
||||
|
||||
// Intersects current scissor rectangle with the specified rectangle.
|
||||
// The scissor rectangle is transformed by the current transform.
|
||||
// Note: in case the rotation of previous scissor rect differs from
|
||||
// the current one, the intersection will be done between the specified
|
||||
// rectangle and the previous scissor rectangle transformed in the current
|
||||
// transform space. The resulting shape is always rectangle.
|
||||
void nvgIntersectScissor(NVGcontext* ctx, float x, float y, float w, float h);
|
||||
|
||||
// Reset and disables scissoring.
|
||||
void nvgResetScissor(NVGcontext* ctx);
|
||||
|
||||
//
|
||||
// Paths
|
||||
//
|
||||
// Drawing a new shape starts with nvgBeginPath(), it clears all the currently defined paths.
|
||||
// Then you define one or more paths and sub-paths which describe the shape. The are functions
|
||||
// to draw common shapes like rectangles and circles, and lower level step-by-step functions,
|
||||
// which allow to define a path curve by curve.
|
||||
//
|
||||
// NanoVG uses even-odd fill rule to draw the shapes. Solid shapes should have counter clockwise
|
||||
// winding and holes should have counter clockwise order. To specify winding of a path you can
|
||||
// call nvgPathWinding(). This is useful especially for the common shapes, which are drawn CCW.
|
||||
//
|
||||
// Finally you can fill the path using current fill style by calling nvgFill(), and stroke it
|
||||
// with current stroke style by calling nvgStroke().
|
||||
//
|
||||
// The curve segments and sub-paths are transformed by the current transform.
|
||||
|
||||
// Clears the current path and sub-paths.
|
||||
void nvgBeginPath(NVGcontext* ctx);
|
||||
|
||||
// Starts new sub-path with specified point as first point.
|
||||
void nvgMoveTo(NVGcontext* ctx, float x, float y);
|
||||
|
||||
// Adds line segment from the last point in the path to the specified point.
|
||||
void nvgLineTo(NVGcontext* ctx, float x, float y);
|
||||
|
||||
// Adds cubic bezier segment from last point in the path via two control points to the specified point.
|
||||
void nvgBezierTo(NVGcontext* ctx, float c1x, float c1y, float c2x, float c2y, float x, float y);
|
||||
|
||||
// Adds quadratic bezier segment from last point in the path via a control point to the specified point.
|
||||
void nvgQuadTo(NVGcontext* ctx, float cx, float cy, float x, float y);
|
||||
|
||||
// Adds an arc segment at the corner defined by the last path point, and two specified points.
|
||||
void nvgArcTo(NVGcontext* ctx, float x1, float y1, float x2, float y2, float radius);
|
||||
|
||||
// Closes current sub-path with a line segment.
|
||||
void nvgClosePath(NVGcontext* ctx);
|
||||
|
||||
// Sets the current sub-path winding, see NVGwinding and NVGsolidity.
|
||||
void nvgPathWinding(NVGcontext* ctx, int dir);
|
||||
|
||||
// Creates new circle arc shaped sub-path. The arc center is at cx,cy, the arc radius is r,
|
||||
// and the arc is drawn from angle a0 to a1, and swept in direction dir (NVG_CCW, or NVG_CW).
|
||||
// Angles are specified in radians.
|
||||
void nvgArc(NVGcontext* ctx, float cx, float cy, float r, float a0, float a1, int dir);
|
||||
|
||||
// Creates new rectangle shaped sub-path.
|
||||
void nvgRect(NVGcontext* ctx, float x, float y, float w, float h);
|
||||
|
||||
// Creates new rounded rectangle shaped sub-path.
|
||||
void nvgRoundedRect(NVGcontext* ctx, float x, float y, float w, float h, float r);
|
||||
|
||||
// Creates new rounded rectangle shaped sub-path with varying radii for each corner.
|
||||
void nvgRoundedRectVarying(NVGcontext* ctx, float x, float y, float w, float h, float radTopLeft, float radTopRight, float radBottomRight, float radBottomLeft);
|
||||
|
||||
// Creates new ellipse shaped sub-path.
|
||||
void nvgEllipse(NVGcontext* ctx, float cx, float cy, float rx, float ry);
|
||||
|
||||
// Creates new circle shaped sub-path.
|
||||
void nvgCircle(NVGcontext* ctx, float cx, float cy, float r);
|
||||
|
||||
// Fills the current path with current fill style.
|
||||
void nvgFill(NVGcontext* ctx);
|
||||
|
||||
// Fills the current path with current stroke style.
|
||||
void nvgStroke(NVGcontext* ctx);
|
||||
|
||||
|
||||
//
|
||||
// Text
|
||||
//
|
||||
// NanoVG allows you to load .ttf files and use the font to render text.
|
||||
//
|
||||
// The appearance of the text can be defined by setting the current text style
|
||||
// and by specifying the fill color. Common text and font settings such as
|
||||
// font size, letter spacing and text align are supported. Font blur allows you
|
||||
// to create simple text effects such as drop shadows.
|
||||
//
|
||||
// At render time the font face can be set based on the font handles or name.
|
||||
//
|
||||
// Font measure functions return values in local space, the calculations are
|
||||
// carried in the same resolution as the final rendering. This is done because
|
||||
// the text glyph positions are snapped to the nearest pixels sharp rendering.
|
||||
//
|
||||
// The local space means that values are not rotated or scale as per the current
|
||||
// transformation. For example if you set font size to 12, which would mean that
|
||||
// line height is 16, then regardless of the current scaling and rotation, the
|
||||
// returned line height is always 16. Some measures may vary because of the scaling
|
||||
// since aforementioned pixel snapping.
|
||||
//
|
||||
// While this may sound a little odd, the setup allows you to always render the
|
||||
// same way regardless of scaling. I.e. following works regardless of scaling:
|
||||
//
|
||||
// const char* txt = "Text me up.";
|
||||
// nvgTextBounds(vg, x,y, txt, NULL, bounds);
|
||||
// nvgBeginPath(vg);
|
||||
// nvgRoundedRect(vg, bounds[0],bounds[1], bounds[2]-bounds[0], bounds[3]-bounds[1]);
|
||||
// nvgFill(vg);
|
||||
//
|
||||
// Note: currently only solid color fill is supported for text.
|
||||
|
||||
// Creates font by loading it from the disk from specified file name.
|
||||
// Returns handle to the font.
|
||||
int nvgCreateFont(NVGcontext* ctx, const char* name, const char* filename);
|
||||
|
||||
// fontIndex specifies which font face to load from a .ttf/.ttc file.
|
||||
int nvgCreateFontAtIndex(NVGcontext* ctx, const char* name, const char* filename, const int fontIndex);
|
||||
|
||||
// Creates font by loading it from the specified memory chunk.
|
||||
// Returns handle to the font.
|
||||
int nvgCreateFontMem(NVGcontext* ctx, const char* name, unsigned char* data, int ndata, int freeData);
|
||||
|
||||
// fontIndex specifies which font face to load from a .ttf/.ttc file.
|
||||
int nvgCreateFontMemAtIndex(NVGcontext* ctx, const char* name, unsigned char* data, int ndata, int freeData, const int fontIndex);
|
||||
|
||||
// Finds a loaded font of specified name, and returns handle to it, or -1 if the font is not found.
|
||||
int nvgFindFont(NVGcontext* ctx, const char* name);
|
||||
|
||||
// Adds a fallback font by handle.
|
||||
int nvgAddFallbackFontId(NVGcontext* ctx, int baseFont, int fallbackFont);
|
||||
|
||||
// Adds a fallback font by name.
|
||||
int nvgAddFallbackFont(NVGcontext* ctx, const char* baseFont, const char* fallbackFont);
|
||||
|
||||
// Resets fallback fonts by handle.
|
||||
void nvgResetFallbackFontsId(NVGcontext* ctx, int baseFont);
|
||||
|
||||
// Resets fallback fonts by name.
|
||||
void nvgResetFallbackFonts(NVGcontext* ctx, const char* baseFont);
|
||||
|
||||
// Sets the font size of current text style.
|
||||
void nvgFontSize(NVGcontext* ctx, float size);
|
||||
|
||||
// Sets the blur of current text style.
|
||||
void nvgFontBlur(NVGcontext* ctx, float blur);
|
||||
|
||||
// Sets the letter spacing of current text style.
|
||||
void nvgTextLetterSpacing(NVGcontext* ctx, float spacing);
|
||||
|
||||
// Sets the proportional line height of current text style. The line height is specified as multiple of font size.
|
||||
void nvgTextLineHeight(NVGcontext* ctx, float lineHeight);
|
||||
|
||||
// Sets the text align of current text style, see NVGalign for options.
|
||||
void nvgTextAlign(NVGcontext* ctx, int align);
|
||||
|
||||
// Sets the font face based on specified id of current text style.
|
||||
void nvgFontFaceId(NVGcontext* ctx, int font);
|
||||
|
||||
// Sets the font face based on specified name of current text style.
|
||||
void nvgFontFace(NVGcontext* ctx, const char* font);
|
||||
|
||||
// Draws text string at specified location. If end is specified only the sub-string up to the end is drawn.
|
||||
float nvgText(NVGcontext* ctx, float x, float y, const char* string, const char* end);
|
||||
|
||||
// Draws multi-line text string at specified location wrapped at the specified width. If end is specified only the sub-string up to the end is drawn.
|
||||
// White space is stripped at the beginning of the rows, the text is split at word boundaries or when new-line characters are encountered.
|
||||
// Words longer than the max width are slit at nearest character (i.e. no hyphenation).
|
||||
void nvgTextBox(NVGcontext* ctx, float x, float y, float breakRowWidth, const char* string, const char* end);
|
||||
|
||||
// Measures the specified text string. Parameter bounds should be a pointer to float[4],
|
||||
// if the bounding box of the text should be returned. The bounds value are [xmin,ymin, xmax,ymax]
|
||||
// Returns the horizontal advance of the measured text (i.e. where the next character should drawn).
|
||||
// Measured values are returned in local coordinate space.
|
||||
float nvgTextBounds(NVGcontext* ctx, float x, float y, const char* string, const char* end, float* bounds);
|
||||
|
||||
// Measures the specified multi-text string. Parameter bounds should be a pointer to float[4],
|
||||
// if the bounding box of the text should be returned. The bounds value are [xmin,ymin, xmax,ymax]
|
||||
// Measured values are returned in local coordinate space.
|
||||
void nvgTextBoxBounds(NVGcontext* ctx, float x, float y, float breakRowWidth, const char* string, const char* end, float* bounds);
|
||||
|
||||
// Calculates the glyph x positions of the specified text. If end is specified only the sub-string will be used.
|
||||
// Measured values are returned in local coordinate space.
|
||||
int nvgTextGlyphPositions(NVGcontext* ctx, float x, float y, const char* string, const char* end, NVGglyphPosition* positions, int maxPositions);
|
||||
|
||||
// Returns the vertical metrics based on the current text style.
|
||||
// Measured values are returned in local coordinate space.
|
||||
void nvgTextMetrics(NVGcontext* ctx, float* ascender, float* descender, float* lineh);
|
||||
|
||||
// Breaks the specified text into lines. If end is specified only the sub-string will be used.
|
||||
// White space is stripped at the beginning of the rows, the text is split at word boundaries or when new-line characters are encountered.
|
||||
// Words longer than the max width are slit at nearest character (i.e. no hyphenation).
|
||||
int nvgTextBreakLines(NVGcontext* ctx, const char* string, const char* end, float breakRowWidth, NVGtextRow* rows, int maxRows);
|
||||
|
||||
//
|
||||
// Internal Render API
|
||||
//
|
||||
enum NVGtexture {
|
||||
NVG_TEXTURE_ALPHA = 0x01,
|
||||
NVG_TEXTURE_RGBA = 0x02,
|
||||
};
|
||||
|
||||
struct NVGscissor {
|
||||
float xform[6];
|
||||
float extent[2];
|
||||
};
|
||||
typedef struct NVGscissor NVGscissor;
|
||||
|
||||
struct NVGvertex {
|
||||
float x,y,u,v;
|
||||
};
|
||||
typedef struct NVGvertex NVGvertex;
|
||||
|
||||
struct NVGpath {
|
||||
int first;
|
||||
int count;
|
||||
unsigned char closed;
|
||||
int nbevel;
|
||||
NVGvertex* fill;
|
||||
int nfill;
|
||||
NVGvertex* stroke;
|
||||
int nstroke;
|
||||
int winding;
|
||||
int convex;
|
||||
};
|
||||
typedef struct NVGpath NVGpath;
|
||||
|
||||
struct NVGparams {
|
||||
void* userPtr;
|
||||
int edgeAntiAlias;
|
||||
int (*renderCreate)(void* uptr);
|
||||
int (*renderCreateTexture)(void* uptr, int type, int w, int h, int imageFlags, const unsigned char* data);
|
||||
int (*renderDeleteTexture)(void* uptr, int image);
|
||||
int (*renderUpdateTexture)(void* uptr, int image, int x, int y, int w, int h, const unsigned char* data);
|
||||
int (*renderGetTextureSize)(void* uptr, int image, int* w, int* h);
|
||||
void (*renderViewport)(void* uptr, float width, float height, float devicePixelRatio);
|
||||
void (*renderCancel)(void* uptr);
|
||||
void (*renderFlush)(void* uptr);
|
||||
void (*renderFill)(void* uptr, NVGpaint* paint, NVGcompositeOperationState compositeOperation, NVGscissor* scissor, float fringe, const float* bounds, const NVGpath* paths, int npaths);
|
||||
void (*renderStroke)(void* uptr, NVGpaint* paint, NVGcompositeOperationState compositeOperation, NVGscissor* scissor, float fringe, float strokeWidth, const NVGpath* paths, int npaths);
|
||||
void (*renderTriangles)(void* uptr, NVGpaint* paint, NVGcompositeOperationState compositeOperation, NVGscissor* scissor, const NVGvertex* verts, int nverts, float fringe);
|
||||
void (*renderDelete)(void* uptr);
|
||||
};
|
||||
typedef struct NVGparams NVGparams;
|
||||
|
||||
// Constructor and destructor, called by the render back-end.
|
||||
NVGcontext* nvgCreateInternal(NVGparams* params);
|
||||
void nvgDeleteInternal(NVGcontext* ctx);
|
||||
|
||||
NVGparams* nvgInternalParams(NVGcontext* ctx);
|
||||
|
||||
// Debug function to dump cached path data.
|
||||
void nvgDebugDumpPathCache(NVGcontext* ctx);
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
|
||||
#define NVG_NOTUSED(v) for (;;) { (void)(1 ? (void)0 : ( (void)(v) ) ); break; }
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // NANOVG_H
|
||||
1660
lib/borealis/library/include/borealis/extern/nanovg/nanovg_gl.h
vendored
Normal file
1660
lib/borealis/library/include/borealis/extern/nanovg/nanovg_gl.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
154
lib/borealis/library/include/borealis/extern/nanovg/nanovg_gl_utils.h
vendored
Normal file
154
lib/borealis/library/include/borealis/extern/nanovg/nanovg_gl_utils.h
vendored
Normal file
@@ -0,0 +1,154 @@
|
||||
//
|
||||
// Copyright (c) 2009-2013 Mikko Mononen memon@inside.org
|
||||
//
|
||||
// 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 NANOVG_GL_UTILS_H
|
||||
#define NANOVG_GL_UTILS_H
|
||||
|
||||
struct NVGLUframebuffer {
|
||||
NVGcontext* ctx;
|
||||
GLuint fbo;
|
||||
GLuint rbo;
|
||||
GLuint texture;
|
||||
int image;
|
||||
};
|
||||
typedef struct NVGLUframebuffer NVGLUframebuffer;
|
||||
|
||||
// Helper function to create GL frame buffer to render to.
|
||||
void nvgluBindFramebuffer(NVGLUframebuffer* fb);
|
||||
NVGLUframebuffer* nvgluCreateFramebuffer(NVGcontext* ctx, int w, int h, int imageFlags);
|
||||
void nvgluDeleteFramebuffer(NVGLUframebuffer* fb);
|
||||
|
||||
#endif // NANOVG_GL_UTILS_H
|
||||
|
||||
#ifdef NANOVG_GL_IMPLEMENTATION
|
||||
|
||||
#if defined(NANOVG_GL3) || defined(NANOVG_GLES2) || defined(NANOVG_GLES3)
|
||||
// FBO is core in OpenGL 3>.
|
||||
# define NANOVG_FBO_VALID 1
|
||||
#elif defined(NANOVG_GL2)
|
||||
// On OS X including glext defines FBO on GL2 too.
|
||||
# ifdef __APPLE__
|
||||
# include <OpenGL/glext.h>
|
||||
# define NANOVG_FBO_VALID 1
|
||||
# endif
|
||||
#endif
|
||||
|
||||
static GLint defaultFBO = -1;
|
||||
|
||||
NVGLUframebuffer* nvgluCreateFramebuffer(NVGcontext* ctx, int w, int h, int imageFlags)
|
||||
{
|
||||
#ifdef NANOVG_FBO_VALID
|
||||
GLint defaultFBO;
|
||||
GLint defaultRBO;
|
||||
NVGLUframebuffer* fb = NULL;
|
||||
|
||||
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &defaultFBO);
|
||||
glGetIntegerv(GL_RENDERBUFFER_BINDING, &defaultRBO);
|
||||
|
||||
fb = (NVGLUframebuffer*)malloc(sizeof(NVGLUframebuffer));
|
||||
if (fb == NULL) goto error;
|
||||
memset(fb, 0, sizeof(NVGLUframebuffer));
|
||||
|
||||
fb->image = nvgCreateImageRGBA(ctx, w, h, imageFlags | NVG_IMAGE_FLIPY | NVG_IMAGE_PREMULTIPLIED, NULL);
|
||||
|
||||
#if defined NANOVG_GL2
|
||||
fb->texture = nvglImageHandleGL2(ctx, fb->image);
|
||||
#elif defined NANOVG_GL3
|
||||
fb->texture = nvglImageHandleGL3(ctx, fb->image);
|
||||
#elif defined NANOVG_GLES2
|
||||
fb->texture = nvglImageHandleGLES2(ctx, fb->image);
|
||||
#elif defined NANOVG_GLES3
|
||||
fb->texture = nvglImageHandleGLES3(ctx, fb->image);
|
||||
#endif
|
||||
|
||||
fb->ctx = ctx;
|
||||
|
||||
// frame buffer object
|
||||
glGenFramebuffers(1, &fb->fbo);
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, fb->fbo);
|
||||
|
||||
// render buffer object
|
||||
glGenRenderbuffers(1, &fb->rbo);
|
||||
glBindRenderbuffer(GL_RENDERBUFFER, fb->rbo);
|
||||
glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, w, h);
|
||||
|
||||
// combine all
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fb->texture, 0);
|
||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, fb->rbo);
|
||||
|
||||
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
|
||||
#ifdef GL_DEPTH24_STENCIL8
|
||||
// If GL_STENCIL_INDEX8 is not supported, try GL_DEPTH24_STENCIL8 as a fallback.
|
||||
// Some graphics cards require a depth buffer along with a stencil.
|
||||
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, w, h);
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fb->texture, 0);
|
||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, fb->rbo);
|
||||
|
||||
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
|
||||
#endif // GL_DEPTH24_STENCIL8
|
||||
goto error;
|
||||
}
|
||||
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, defaultFBO);
|
||||
glBindRenderbuffer(GL_RENDERBUFFER, defaultRBO);
|
||||
return fb;
|
||||
error:
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, defaultFBO);
|
||||
glBindRenderbuffer(GL_RENDERBUFFER, defaultRBO);
|
||||
nvgluDeleteFramebuffer(fb);
|
||||
return NULL;
|
||||
#else
|
||||
NVG_NOTUSED(ctx);
|
||||
NVG_NOTUSED(w);
|
||||
NVG_NOTUSED(h);
|
||||
NVG_NOTUSED(imageFlags);
|
||||
return NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
void nvgluBindFramebuffer(NVGLUframebuffer* fb)
|
||||
{
|
||||
#ifdef NANOVG_FBO_VALID
|
||||
if (defaultFBO == -1) glGetIntegerv(GL_FRAMEBUFFER_BINDING, &defaultFBO);
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, fb != NULL ? fb->fbo : defaultFBO);
|
||||
#else
|
||||
NVG_NOTUSED(fb);
|
||||
#endif
|
||||
}
|
||||
|
||||
void nvgluDeleteFramebuffer(NVGLUframebuffer* fb)
|
||||
{
|
||||
#ifdef NANOVG_FBO_VALID
|
||||
if (fb == NULL) return;
|
||||
if (fb->fbo != 0)
|
||||
glDeleteFramebuffers(1, &fb->fbo);
|
||||
if (fb->rbo != 0)
|
||||
glDeleteRenderbuffers(1, &fb->rbo);
|
||||
if (fb->image >= 0)
|
||||
nvgDeleteImage(fb->ctx, fb->image);
|
||||
fb->ctx = NULL;
|
||||
fb->fbo = 0;
|
||||
fb->rbo = 0;
|
||||
fb->texture = 0;
|
||||
fb->image = -1;
|
||||
free(fb);
|
||||
#else
|
||||
NVG_NOTUSED(fb);
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif // NANOVG_GL_IMPLEMENTATION
|
||||
7547
lib/borealis/library/include/borealis/extern/nanovg/stb_image.h
vendored
Normal file
7547
lib/borealis/library/include/borealis/extern/nanovg/stb_image.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
4882
lib/borealis/library/include/borealis/extern/nanovg/stb_truetype.h
vendored
Normal file
4882
lib/borealis/library/include/borealis/extern/nanovg/stb_truetype.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
25447
lib/borealis/library/include/borealis/extern/nlohmann/json.hpp
vendored
Normal file
25447
lib/borealis/library/include/borealis/extern/nlohmann/json.hpp
vendored
Normal file
File diff suppressed because it is too large
Load Diff
53
lib/borealis/library/include/borealis/frame_context.hpp
Normal file
53
lib/borealis/library/include/borealis/frame_context.hpp
Normal file
@@ -0,0 +1,53 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019 natinusala
|
||||
Copyright (C) 2019 p-sam
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <nanovg/nanovg.h>
|
||||
|
||||
#include <borealis/style.hpp>
|
||||
#include <borealis/theme.hpp>
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
class FontStash
|
||||
{
|
||||
public:
|
||||
int regular = 0;
|
||||
int standard = 0;
|
||||
int schinese = 0;
|
||||
int extSchinese = 0;
|
||||
int tchinese = 0;
|
||||
int korean = 0;
|
||||
|
||||
int material = 0;
|
||||
int sharedSymbols = 0;
|
||||
};
|
||||
|
||||
class FrameContext
|
||||
{
|
||||
public:
|
||||
NVGcontext* vg = nullptr;
|
||||
float pixelRatio = 0.0;
|
||||
FontStash* fontStash = nullptr;
|
||||
Theme* theme = nullptr;
|
||||
};
|
||||
|
||||
} // namespace brls
|
||||
42
lib/borealis/library/include/borealis/header.hpp
Normal file
42
lib/borealis/library/include/borealis/header.hpp
Normal file
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019 natinusala
|
||||
Copyright (C) 2019 p-sam
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <borealis/view.hpp>
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
// A simple header with text, a rectangle on the left
|
||||
// and a separator
|
||||
class Header : public View
|
||||
{
|
||||
private:
|
||||
std::string label;
|
||||
std::string sublabel;
|
||||
bool separator;
|
||||
|
||||
public:
|
||||
Header(std::string label, bool separator = true, std::string sublabel = "");
|
||||
|
||||
void draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, Style* style, FrameContext* ctx) override;
|
||||
};
|
||||
|
||||
} // namespace brls
|
||||
63
lib/borealis/library/include/borealis/hint.hpp
Normal file
63
lib/borealis/library/include/borealis/hint.hpp
Normal file
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2020 WerWolv
|
||||
Copyright (C) 2020 natinusala
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <borealis/box_layout.hpp>
|
||||
#include <borealis/label.hpp>
|
||||
#include <borealis/view.hpp>
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
// Displays button hints for the currently focused view
|
||||
// Depending on the view's available actions
|
||||
// there can only be one Hint visible at any time
|
||||
class Hint : public BoxLayout
|
||||
{
|
||||
private:
|
||||
bool animate;
|
||||
|
||||
GenericEvent::Subscription globalFocusEventSubscriptor;
|
||||
VoidEvent::Subscription globalHintsUpdateEventSubscriptor;
|
||||
|
||||
static inline std::vector<Hint*> globalHintStack;
|
||||
|
||||
static void pushHint(Hint* hint);
|
||||
static void popHint(Hint* hint);
|
||||
static void animateHints();
|
||||
|
||||
static std::string getKeyIcon(Key key);
|
||||
|
||||
public:
|
||||
Hint(bool animate = true);
|
||||
~Hint();
|
||||
|
||||
void rebuildHints(bool force = false);
|
||||
|
||||
void willAppear(bool resetState = false) override;
|
||||
void willDisappear(bool resetState = false) override;
|
||||
|
||||
void setAnimate(bool animate)
|
||||
{
|
||||
this->animate = animate;
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace brls
|
||||
90
lib/borealis/library/include/borealis/i18n.hpp
Normal file
90
lib/borealis/library/include/borealis/i18n.hpp
Normal file
@@ -0,0 +1,90 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2020 natinusala
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <fmt/core.h>
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace brls::i18n
|
||||
{
|
||||
|
||||
// TODO: add support for string arrays
|
||||
|
||||
namespace internal
|
||||
{
|
||||
std::string getRawStr(std::string stringName);
|
||||
} // namespace internal
|
||||
|
||||
/**
|
||||
* Returns the translation for the given string,
|
||||
* after injecting format parameters (if any)
|
||||
*/
|
||||
template <typename... Args>
|
||||
std::string getStr(std::string stringName, Args&&... args)
|
||||
{
|
||||
std::string rawStr = brls::i18n::internal::getRawStr(stringName);
|
||||
|
||||
try
|
||||
{
|
||||
return fmt::format(rawStr, args...);
|
||||
}
|
||||
catch (const std::exception& e)
|
||||
{
|
||||
Logger::error("Invalid format \"{}\" from string \"{}\": {}", rawStr, stringName, e.what());
|
||||
return stringName;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads all translations of the current system locale + default locale
|
||||
* Must be called before trying to get a translation!
|
||||
*/
|
||||
void loadTranslations();
|
||||
|
||||
/**
|
||||
* Loads all translations of the desired locale + default locale
|
||||
* Must be called before trying to get a translation!
|
||||
*/
|
||||
void loadTranslations(std::string locale);
|
||||
|
||||
/**
|
||||
* Returns the current system locale
|
||||
* NOT the one that's currently used in the app!
|
||||
*/
|
||||
std::string getCurrentLocale();
|
||||
|
||||
/**
|
||||
* Returns the current system locale id
|
||||
* this id only make sense for libnx
|
||||
* NOT the one that's currently used in the app!
|
||||
*/
|
||||
int nxGetCurrentLocaleID();
|
||||
|
||||
inline namespace literals
|
||||
{
|
||||
/**
|
||||
* Returns the translation for the given string, without
|
||||
* injecting any parameters
|
||||
* Shortcut to i18n::getStr(stringName)
|
||||
*/
|
||||
std::string operator"" _i18n(const char* str, size_t len);
|
||||
} // namespace literals
|
||||
|
||||
} // namespace brls::i18n
|
||||
99
lib/borealis/library/include/borealis/image.hpp
Normal file
99
lib/borealis/library/include/borealis/image.hpp
Normal file
@@ -0,0 +1,99 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019 WerWolv
|
||||
Copyright (C) 2019 p-sam
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <borealis/frame_context.hpp>
|
||||
#include <borealis/view.hpp>
|
||||
|
||||
// fwd for std::swap
|
||||
namespace brls
|
||||
{
|
||||
class Image;
|
||||
}
|
||||
// fwd for friend declaration in brls::Image
|
||||
namespace std
|
||||
{
|
||||
void swap(brls::Image& a, brls::Image& b);
|
||||
}
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
enum class ImageScaleType
|
||||
{
|
||||
NO_RESIZE = 0, // Nothing is resized
|
||||
FIT, // The image is shrinked to fit the view boundaries
|
||||
CROP, // The image is not resized but is cropped if bigger than the view
|
||||
SCALE, // The image is stretched to match the view boundaries
|
||||
VIEW_RESIZE // The view is resized to match the image
|
||||
};
|
||||
|
||||
// An image
|
||||
class Image : public View
|
||||
{
|
||||
friend void std::swap(Image& a, Image& b);
|
||||
|
||||
public:
|
||||
Image() = default;
|
||||
Image(std::string imagePath);
|
||||
Image(unsigned char* buffer, size_t bufferSize);
|
||||
|
||||
~Image();
|
||||
Image(const Image& copy);
|
||||
Image(Image&& move) noexcept;
|
||||
Image& operator=(const Image& cp_assign);
|
||||
Image& operator=(Image&& mv_assign);
|
||||
|
||||
void draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, Style* style, FrameContext* ctx) override;
|
||||
void layout(NVGcontext* vg, Style* style, FontStash* stash) override;
|
||||
|
||||
void setImage(unsigned char* buffer, size_t bufferSize);
|
||||
void setImage(std::string imagePath);
|
||||
|
||||
void setScaleType(ImageScaleType imageScaleType);
|
||||
void setOpacity(float opacity);
|
||||
|
||||
void setCornerRadius(float radius)
|
||||
{
|
||||
this->cornerRadius = radius;
|
||||
}
|
||||
|
||||
unsigned char* copyImgBuf() const;
|
||||
|
||||
private:
|
||||
std::string imagePath;
|
||||
unsigned char* imageBuffer = nullptr;
|
||||
size_t imageBufferSize = 0;
|
||||
|
||||
int texture = -1;
|
||||
NVGpaint imgPaint;
|
||||
|
||||
ImageScaleType imageScaleType = ImageScaleType::FIT;
|
||||
|
||||
float cornerRadius = 0;
|
||||
|
||||
int imageX = 0, imageY = 0;
|
||||
int imageWidth = 0, imageHeight = 0;
|
||||
int origViewWidth = 0, origViewHeight = 0;
|
||||
|
||||
void reloadTexture();
|
||||
};
|
||||
|
||||
} // namespace brls
|
||||
173
lib/borealis/library/include/borealis/label.hpp
Normal file
173
lib/borealis/library/include/borealis/label.hpp
Normal file
@@ -0,0 +1,173 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019-2020 natinusala
|
||||
Copyright (C) 2019 p-sam
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
#include <borealis/view.hpp>
|
||||
#include <borealis/animations.hpp>
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
enum class LabelStyle : std::uint32_t
|
||||
{
|
||||
REGULAR = 0,
|
||||
MEDIUM,
|
||||
SMALL,
|
||||
DESCRIPTION,
|
||||
FPS,
|
||||
CRASH,
|
||||
BUTTON_PRIMARY,
|
||||
BUTTON_PRIMARY_DISABLED,
|
||||
BUTTON_BORDERLESS,
|
||||
LIST_ITEM,
|
||||
LIST_ITEM_VALUE,
|
||||
LIST_ITEM_VALUE_FAINT,
|
||||
NOTIFICATION,
|
||||
DIALOG,
|
||||
BUTTON_DIALOG,
|
||||
HINT,
|
||||
BUTTON_BORDERED,
|
||||
BUTTON_REGULAR
|
||||
};
|
||||
|
||||
enum class LabelAnimation
|
||||
{
|
||||
EASE_IN,
|
||||
EASE_OUT
|
||||
};
|
||||
|
||||
// A Label, multiline or with a ticker
|
||||
class Label : public View
|
||||
{
|
||||
private:
|
||||
std::string text = "";
|
||||
std::string textTicker = "";
|
||||
std::string textEllipsis = "";
|
||||
|
||||
bool multiline;
|
||||
unsigned fontSize;
|
||||
float lineHeight;
|
||||
LabelStyle labelStyle, oldLabelStyle;
|
||||
|
||||
NVGalign horizontalAlign = NVG_ALIGN_LEFT;
|
||||
NVGalign verticalAlign = NVG_ALIGN_MIDDLE;
|
||||
|
||||
NVGcolor customColor;
|
||||
bool useCustomColor = false;
|
||||
|
||||
int customFont;
|
||||
bool useCustomFont = false;
|
||||
|
||||
unsigned textWidth = 0, textHeight = 0;
|
||||
unsigned oldWidth = 0;
|
||||
|
||||
unsigned textTickerWidth = 0;
|
||||
float tickerOffset = 0.0f;
|
||||
|
||||
bool tickerActive = false;
|
||||
menu_timer_t tickerWaitTimer;
|
||||
menu_timer_ctx_entry_t tickerWaitTimerCtx;
|
||||
|
||||
float textAnimation = 1.0f;
|
||||
|
||||
GenericEvent::Subscription parentFocusSubscription;
|
||||
|
||||
unsigned getFontSize(LabelStyle labelStyle);
|
||||
float getLineHeight(LabelStyle labelStyle);
|
||||
|
||||
void onParentFocus();
|
||||
void onParentUnfocus();
|
||||
|
||||
void updateTextDimensions();
|
||||
|
||||
size_t getUtf8StringLength(const std::string& str);
|
||||
std::string getUtf8SubString(const std::string& str, size_t start, size_t len = std::string::npos);
|
||||
|
||||
public:
|
||||
Label(LabelStyle labelStyle, std::string text, bool multiline = false);
|
||||
~Label();
|
||||
|
||||
void draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, Style* style, FrameContext* ctx) override;
|
||||
void layout(NVGcontext* vg, Style* style, FontStash* stash) override;
|
||||
|
||||
void setVerticalAlign(NVGalign align);
|
||||
void setHorizontalAlign(NVGalign align);
|
||||
void setText(std::string text);
|
||||
void setStyle(LabelStyle style);
|
||||
void setFontSize(unsigned size);
|
||||
|
||||
void startTickerAnimation();
|
||||
void stopTickerAnimation();
|
||||
|
||||
const std::string& getText();
|
||||
|
||||
/**
|
||||
* Only useful for single line labels.
|
||||
*/
|
||||
unsigned getTextWidth();
|
||||
unsigned getTextHeight();
|
||||
|
||||
/**
|
||||
* Sets the label color
|
||||
*/
|
||||
void setColor(NVGcolor color);
|
||||
|
||||
/**
|
||||
* Unsets the label color - it
|
||||
* will now use the default one
|
||||
* for the label style
|
||||
*/
|
||||
void unsetColor();
|
||||
|
||||
/**
|
||||
* Returns the effective label color
|
||||
* = custom or the style default
|
||||
*/
|
||||
NVGcolor getColor(Theme* theme);
|
||||
|
||||
/**
|
||||
* Sets the font id
|
||||
*/
|
||||
void setFont(int fontId);
|
||||
|
||||
/**
|
||||
* Unsets the font id - it
|
||||
* will now use the regular one
|
||||
*/
|
||||
void unsetFont();
|
||||
|
||||
/**
|
||||
* Returns the font used
|
||||
* = custom or the regular font
|
||||
*/
|
||||
int getFont(FontStash* stash);
|
||||
|
||||
/**
|
||||
* Sets the ticker state to active (scrolling) or inactive (ellipsis)
|
||||
*/
|
||||
void setTickerState(bool active);
|
||||
|
||||
float getTextAnimation();
|
||||
void resetTextAnimation();
|
||||
void animate(LabelAnimation animation);
|
||||
};
|
||||
|
||||
} // namespace brls
|
||||
51
lib/borealis/library/include/borealis/layer_view.hpp
Normal file
51
lib/borealis/library/include/borealis/layer_view.hpp
Normal file
@@ -0,0 +1,51 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019 WerWolv
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <borealis/view.hpp>
|
||||
#include <vector>
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
// A view containing multiple children views with the ability to freely switch between these layers
|
||||
class LayerView : public View
|
||||
{
|
||||
public:
|
||||
LayerView();
|
||||
~LayerView();
|
||||
|
||||
void addLayer(View* view);
|
||||
void changeLayer(int index, bool focus = false);
|
||||
int getLayerIndex();
|
||||
|
||||
View* getDefaultFocus() override;
|
||||
|
||||
void draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, Style* style, FrameContext* ctx) override;
|
||||
void layout(NVGcontext* vg, Style* style, FontStash* stash) override;
|
||||
|
||||
void willAppear(bool resetState = false) override;
|
||||
void willDisappear(bool resetState = false) override;
|
||||
|
||||
private:
|
||||
std::vector<View*> layers;
|
||||
int selectedIndex = 0;
|
||||
};
|
||||
|
||||
}
|
||||
225
lib/borealis/library/include/borealis/list.hpp
Normal file
225
lib/borealis/library/include/borealis/list.hpp
Normal file
@@ -0,0 +1,225 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019-2020 natinusala
|
||||
Copyright (C) 2019 p-sam
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <borealis/box_layout.hpp>
|
||||
#include <borealis/image.hpp>
|
||||
#include <borealis/label.hpp>
|
||||
#include <borealis/rectangle.hpp>
|
||||
#include <borealis/scroll_view.hpp>
|
||||
#include <borealis/swkbd.hpp>
|
||||
#include <string>
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
// A list item
|
||||
// TODO: Use a Label with integrated ticker
|
||||
class ListItem : public View
|
||||
{
|
||||
protected:
|
||||
bool valueFaint = false, oldValueFaint = false;
|
||||
|
||||
bool checked = false; // check mark on the right
|
||||
|
||||
unsigned textSize;
|
||||
|
||||
bool drawTopSeparator = true;
|
||||
|
||||
Label* labelView = nullptr;
|
||||
Label* descriptionView = nullptr;
|
||||
Label* subLabelView = nullptr;
|
||||
Label* valueView = nullptr;
|
||||
Label* oldValueView = nullptr;
|
||||
Image* thumbnailView = nullptr;
|
||||
|
||||
bool reduceDescriptionSpacing = false;
|
||||
|
||||
GenericEvent clickEvent;
|
||||
|
||||
bool indented = false;
|
||||
|
||||
public:
|
||||
ListItem(std::string label, std::string description = "", std::string subLabel = "");
|
||||
|
||||
void draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, Style* style, FrameContext* ctx) override;
|
||||
void layout(NVGcontext* vg, Style* style, FontStash* stash) override;
|
||||
void getHighlightInsets(unsigned* top, unsigned* right, unsigned* bottom, unsigned* left) override;
|
||||
virtual bool onClick();
|
||||
View* getDefaultFocus() override;
|
||||
|
||||
void setThumbnail(Image* image);
|
||||
void setThumbnail(std::string imagePath);
|
||||
void setThumbnail(unsigned char* buffer, size_t bufferSize);
|
||||
|
||||
void setDescription(std::string description);
|
||||
bool hasDescription();
|
||||
std::string getDescription();
|
||||
void setDrawTopSeparator(bool draw);
|
||||
|
||||
bool getReduceDescriptionSpacing();
|
||||
void setReduceDescriptionSpacing(bool value);
|
||||
|
||||
void setIndented(bool indented);
|
||||
|
||||
void setTextSize(unsigned textSize);
|
||||
|
||||
void setChecked(bool checked);
|
||||
|
||||
void setLabel(std::string label);
|
||||
std::string getLabel();
|
||||
|
||||
void setSubLabel(std::string subLabel);
|
||||
std::string getSubLabel();
|
||||
|
||||
/**
|
||||
* Sets the value of this list item
|
||||
* (the text on the right)
|
||||
* Set faint to true to have the new value
|
||||
* use a darker color (typically "OFF" labels)
|
||||
*/
|
||||
void setValue(std::string value, bool faint = false, bool animate = true);
|
||||
std::string getValue();
|
||||
|
||||
GenericEvent* getClickEvent();
|
||||
|
||||
~ListItem();
|
||||
};
|
||||
|
||||
// Some spacing (to make groups of ListItems)
|
||||
class ListItemGroupSpacing : public Rectangle
|
||||
{
|
||||
public:
|
||||
ListItemGroupSpacing(bool separator = false);
|
||||
};
|
||||
|
||||
// A list item with mutliple choices for its value
|
||||
// (will open a Dropdown)
|
||||
|
||||
// Fired when the user has selected a value
|
||||
//
|
||||
// Parameter is either the selected value index
|
||||
// or -1 if the user cancelled
|
||||
typedef Event<int> ValueSelectedEvent;
|
||||
|
||||
class SelectListItem : public ListItem
|
||||
{
|
||||
public:
|
||||
SelectListItem(std::string label, std::vector<std::string> values, unsigned selectedValue = 0, std::string description = "");
|
||||
|
||||
void setSelectedValue(unsigned value);
|
||||
unsigned getSelectedValue();
|
||||
|
||||
ValueSelectedEvent* getValueSelectedEvent();
|
||||
|
||||
protected:
|
||||
std::vector<std::string> values;
|
||||
unsigned selectedValue = 0;
|
||||
|
||||
ValueSelectedEvent valueEvent;
|
||||
};
|
||||
|
||||
// A list item with a ON/OFF value
|
||||
// that can be toggled
|
||||
// Use the click event to detect when the value
|
||||
// changes
|
||||
class ToggleListItem : public ListItem
|
||||
{
|
||||
protected:
|
||||
bool toggleState;
|
||||
std::string onValue, offValue;
|
||||
|
||||
void updateValue();
|
||||
|
||||
public:
|
||||
ToggleListItem(std::string label, bool initialValue, std::string description = "", std::string onValue = "On", std::string offValue = "Off");
|
||||
|
||||
virtual bool onClick() override;
|
||||
|
||||
bool getToggleState();
|
||||
};
|
||||
|
||||
// A list item which spawns the swkbd
|
||||
// to input its value (string)
|
||||
class InputListItem : public ListItem
|
||||
{
|
||||
protected:
|
||||
std::string helpText;
|
||||
int maxInputLength;
|
||||
int kbdDisableBitmask;
|
||||
|
||||
public:
|
||||
InputListItem(std::string label, std::string initialValue, std::string helpText, std::string description = "", int maxInputLength = 32, int kbdDisableBitmask = KeyboardKeyDisableBitmask::KEYBOARD_DISABLE_NONE);
|
||||
|
||||
virtual bool onClick() override;
|
||||
};
|
||||
|
||||
// A list item which spawns the swkbd
|
||||
// to input its value (integer)
|
||||
class IntegerInputListItem : public InputListItem
|
||||
{
|
||||
public:
|
||||
IntegerInputListItem(std::string label, int initialValue, std::string helpText, std::string description = "", int maxInputLength = 32, int kbdDisableBitmask = KeyboardKeyDisableBitmask::KEYBOARD_DISABLE_NONE);
|
||||
|
||||
virtual bool onClick() override;
|
||||
};
|
||||
|
||||
class List; // forward declaration for ListContentView::list
|
||||
|
||||
// The content view of lists (used internally)
|
||||
class ListContentView : public BoxLayout
|
||||
{
|
||||
public:
|
||||
ListContentView(List* list, size_t defaultFocus = 0);
|
||||
|
||||
protected:
|
||||
void customSpacing(View* current, View* next, int* spacing) override;
|
||||
|
||||
private:
|
||||
List* list;
|
||||
};
|
||||
|
||||
// A vertical list of various widgets, with proper margins and spacing
|
||||
// and a scroll bar
|
||||
// In practice it's a ScrollView which content view is
|
||||
// a ListContentView (BoxLayout)
|
||||
class List : public ScrollView
|
||||
{
|
||||
private:
|
||||
ListContentView* layout;
|
||||
|
||||
public:
|
||||
List(size_t defaultFocus = 0);
|
||||
~List();
|
||||
|
||||
// Wrapped BoxLayout methods
|
||||
void addView(View* view, bool fill = false);
|
||||
void removeView(int index, bool free = true);
|
||||
void clear(bool free = true);
|
||||
size_t getViewsCount();
|
||||
View* getChild(size_t i);
|
||||
void setMargins(unsigned top, unsigned right, unsigned bottom, unsigned left);
|
||||
void setMarginBottom(unsigned bottom);
|
||||
void setSpacing(unsigned spacing);
|
||||
unsigned getSpacing();
|
||||
virtual void customSpacing(View* current, View* next, int* spacing);
|
||||
};
|
||||
|
||||
} // namespace brls
|
||||
93
lib/borealis/library/include/borealis/logger.hpp
Normal file
93
lib/borealis/library/include/borealis/logger.hpp
Normal file
@@ -0,0 +1,93 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019 natinusala
|
||||
Copyright (C) 2019 p-sam
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <fmt/core.h>
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
enum class LogLevel
|
||||
{
|
||||
ERROR = 0,
|
||||
WARNING,
|
||||
INFO,
|
||||
DEBUG
|
||||
};
|
||||
|
||||
class Logger
|
||||
{
|
||||
public:
|
||||
static void setLogLevel(LogLevel logLevel);
|
||||
|
||||
template <typename... Args>
|
||||
inline static void log(LogLevel logLevel, std::string prefix, std::string color, std::string format, Args&&... args)
|
||||
{
|
||||
if (Logger::logLevel < logLevel)
|
||||
return;
|
||||
|
||||
try
|
||||
{
|
||||
fmt::print("\033{}[{}]\033[0m ", color, prefix);
|
||||
fmt::print(format, args...);
|
||||
fmt::print("\n");
|
||||
}
|
||||
catch (const std::exception& e)
|
||||
{
|
||||
// will be printed after the first fmt::print (so after the log tag)
|
||||
printf("! Invalid log format string: \"%s\": %s\n", format.c_str(), e.what());
|
||||
}
|
||||
|
||||
#ifdef __MINGW32__
|
||||
fflush(0);
|
||||
#endif
|
||||
}
|
||||
|
||||
template <typename... Args>
|
||||
inline static void error(std::string format, Args&&... args)
|
||||
{
|
||||
Logger::log(LogLevel::ERROR, "ERROR", "[0;31m", format, args...);
|
||||
}
|
||||
|
||||
template <typename... Args>
|
||||
inline static void warning(std::string format, Args&&... args)
|
||||
{
|
||||
Logger::log(LogLevel::WARNING, "WARNING", "[0;33m", format, args...);
|
||||
}
|
||||
|
||||
template <typename... Args>
|
||||
inline static void info(std::string format, Args&&... args)
|
||||
{
|
||||
Logger::log(LogLevel::INFO, "INFO", "[0;34m", format, args...);
|
||||
}
|
||||
|
||||
template <typename... Args>
|
||||
inline static void debug(std::string format, Args&&... args)
|
||||
{
|
||||
Logger::log(LogLevel::DEBUG, "DEBUG", "[0;32m", format, args...);
|
||||
}
|
||||
|
||||
private:
|
||||
inline static LogLevel logLevel = LogLevel::INFO;
|
||||
};
|
||||
|
||||
} // namespace brls
|
||||
47
lib/borealis/library/include/borealis/material_icon.hpp
Normal file
47
lib/borealis/library/include/borealis/material_icon.hpp
Normal file
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019 natinusala
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <borealis/view.hpp>
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
// A Material icon (from the Material font)
|
||||
class MaterialIcon : public View
|
||||
{
|
||||
private:
|
||||
std::string icon;
|
||||
unsigned middleX, middleY;
|
||||
|
||||
bool useCustomColor = false;
|
||||
NVGcolor customColor;
|
||||
|
||||
NVGcolor getColor(Theme* theme);
|
||||
|
||||
public:
|
||||
MaterialIcon(std::string icon);
|
||||
|
||||
void draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, Style* style, FrameContext* ctx) override;
|
||||
void layout(NVGcontext* vg, Style* style, FontStash* stash) override;
|
||||
|
||||
void setColor(NVGcolor color);
|
||||
};
|
||||
|
||||
} // namespace brls
|
||||
@@ -0,0 +1,64 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019 natinusala
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <borealis/animations.hpp>
|
||||
#include <borealis/label.hpp>
|
||||
#include <borealis/view.hpp>
|
||||
|
||||
#define BRLS_NOTIFICATIONS_MAX 8
|
||||
|
||||
// TODO: check in HOS that the animation duration + notification timeout are correct
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
class Notification : public View
|
||||
{
|
||||
public:
|
||||
Notification(std::string text);
|
||||
~Notification();
|
||||
|
||||
void draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, Style* style, FrameContext* ctx) override;
|
||||
void layout(NVGcontext* vg, Style* style, FontStash* stash) override;
|
||||
|
||||
menu_timer_t timeoutTimer;
|
||||
|
||||
private:
|
||||
Label* label;
|
||||
};
|
||||
|
||||
class NotificationManager : public View
|
||||
{
|
||||
private:
|
||||
Notification* notifications[BRLS_NOTIFICATIONS_MAX];
|
||||
|
||||
void layoutNotification(size_t i);
|
||||
|
||||
public:
|
||||
NotificationManager();
|
||||
~NotificationManager();
|
||||
|
||||
void draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, Style* style, FrameContext* ctx) override;
|
||||
void layout(NVGcontext* vg, Style* style, FontStash* stash) override;
|
||||
|
||||
void notify(std::string text);
|
||||
};
|
||||
|
||||
}; // namespace brls
|
||||
63
lib/borealis/library/include/borealis/popup_frame.hpp
Normal file
63
lib/borealis/library/include/borealis/popup_frame.hpp
Normal file
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019 natinusala
|
||||
Copyright (C) 2019 WerWolv
|
||||
Copyright (C) 2019 p-sam
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <borealis/applet_frame.hpp>
|
||||
#include <borealis/list.hpp>
|
||||
#include <borealis/view.hpp>
|
||||
#include <string>
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
class PopupFrame : public View
|
||||
{
|
||||
private:
|
||||
PopupFrame(std::string title, unsigned char* imageBuffer, size_t imageBufferSize, AppletFrame* contentView, std::string subTitleLeft = "", std::string subTitleRight = "");
|
||||
PopupFrame(std::string title, std::string imagePath, AppletFrame* contentView, std::string subTitleLeft = "", std::string subTitleRight = "");
|
||||
PopupFrame(std::string title, AppletFrame* contentView, std::string subTitleLeft = "", std::string subTitleRight = "");
|
||||
|
||||
AppletFrame* contentView = nullptr;
|
||||
|
||||
protected:
|
||||
unsigned getShowAnimationDuration(ViewAnimation animation) override;
|
||||
|
||||
public:
|
||||
~PopupFrame();
|
||||
|
||||
void draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, Style* style, FrameContext* ctx) override;
|
||||
void layout(NVGcontext* vg, Style* style, FontStash* stash) override;
|
||||
View* getDefaultFocus() override;
|
||||
virtual bool onCancel();
|
||||
void willAppear(bool resetState = false) override;
|
||||
void willDisappear(bool resetState = false) override;
|
||||
|
||||
static void open(std::string title, unsigned char* imageBuffer, size_t imageBufferSize, AppletFrame* contentView, std::string subTitleLeft = "", std::string subTitleRight = "");
|
||||
static void open(std::string title, std::string imagePath, AppletFrame* contentView, std::string subTitleLeft = "", std::string subTitleRight = "");
|
||||
static void open(std::string title, AppletFrame* contentView, std::string subTitleLeft = "", std::string subTitleRight = "");
|
||||
|
||||
bool isTranslucent() override
|
||||
{
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace brls
|
||||
57
lib/borealis/library/include/borealis/progress_display.hpp
Normal file
57
lib/borealis/library/include/borealis/progress_display.hpp
Normal file
@@ -0,0 +1,57 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019 Billy Laws
|
||||
Copyright (C) 2019 p-sam
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <borealis/label.hpp>
|
||||
#include <borealis/progress_spinner.hpp>
|
||||
#include <borealis/view.hpp>
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
enum ProgressDisplayFlags
|
||||
{
|
||||
SPINNER = 1u << 0,
|
||||
PERCENTAGE = 1u << 1
|
||||
};
|
||||
|
||||
inline constexpr ProgressDisplayFlags DEFAULT_PROGRESS_DISPLAY_FLAGS = (ProgressDisplayFlags)(ProgressDisplayFlags::SPINNER | ProgressDisplayFlags::PERCENTAGE);
|
||||
|
||||
// A progress bar with an optional spinner and percentage text.
|
||||
class ProgressDisplay : public View
|
||||
{
|
||||
public:
|
||||
ProgressDisplay(ProgressDisplayFlags progressFlags = DEFAULT_PROGRESS_DISPLAY_FLAGS);
|
||||
~ProgressDisplay();
|
||||
|
||||
void draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, Style* style, FrameContext* ctx) override;
|
||||
void layout(NVGcontext* vg, Style* style, FontStash* stash) override;
|
||||
void willAppear(bool resetState = false) override;
|
||||
void willDisappear(bool resetState = false) override;
|
||||
|
||||
void setProgress(int current, int max);
|
||||
|
||||
private:
|
||||
float progressPercentage = 0.0f;
|
||||
Label* label;
|
||||
ProgressSpinner* spinner;
|
||||
};
|
||||
|
||||
} // namespace brls
|
||||
44
lib/borealis/library/include/borealis/progress_spinner.hpp
Normal file
44
lib/borealis/library/include/borealis/progress_spinner.hpp
Normal file
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019 Billy Laws
|
||||
Copyright (C) 2019 p-sam
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <borealis/view.hpp>
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
// A progress spinner
|
||||
class ProgressSpinner : public View
|
||||
{
|
||||
public:
|
||||
ProgressSpinner();
|
||||
|
||||
void draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, Style* style, FrameContext* ctx) override;
|
||||
void layout(NVGcontext* vg, Style* style, FontStash* stash) override;
|
||||
void willAppear(bool resetState = false) override;
|
||||
void willDisappear(bool resetState = false) override;
|
||||
|
||||
private:
|
||||
float animationValue = 0.0f;
|
||||
|
||||
void restartAnimation();
|
||||
};
|
||||
|
||||
} // namespace brls
|
||||
47
lib/borealis/library/include/borealis/rectangle.hpp
Normal file
47
lib/borealis/library/include/borealis/rectangle.hpp
Normal file
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019 natinusala
|
||||
Copyright (C) 2019 p-sam
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <borealis/frame_context.hpp>
|
||||
#include <borealis/view.hpp>
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
// A solid color rectangle
|
||||
class Rectangle : public View
|
||||
{
|
||||
protected:
|
||||
void layout(NVGcontext* vg, Style* style, FontStash* stash) override;
|
||||
|
||||
public:
|
||||
Rectangle(NVGcolor color);
|
||||
|
||||
void draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, Style* style, FrameContext* ctx) override;
|
||||
|
||||
void setColor(NVGcolor color);
|
||||
|
||||
~Rectangle() { }
|
||||
|
||||
private:
|
||||
NVGcolor color = nvgRGB(0, 0, 255);
|
||||
};
|
||||
|
||||
} // namespace brls
|
||||
87
lib/borealis/library/include/borealis/repeating_task.hpp
Normal file
87
lib/borealis/library/include/borealis/repeating_task.hpp
Normal file
@@ -0,0 +1,87 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019 natinusala
|
||||
Copyright (C) 2019 p-sam
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <libretro-common/features/features_cpu.h>
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
// A task that is repeated at a given interval
|
||||
// by the UI thread
|
||||
class RepeatingTask
|
||||
{
|
||||
private:
|
||||
retro_time_t interval;
|
||||
|
||||
retro_time_t lastRun = 0;
|
||||
|
||||
bool running = false;
|
||||
bool stopRequested = false;
|
||||
|
||||
public:
|
||||
RepeatingTask(retro_time_t interval);
|
||||
virtual ~RepeatingTask();
|
||||
|
||||
/**
|
||||
* Actual code to run by the task
|
||||
* Must call RepeatingTask::run() !
|
||||
*/
|
||||
virtual void run(retro_time_t currentTime);
|
||||
|
||||
/**
|
||||
* Fired when the task starts
|
||||
*/
|
||||
virtual void onStart() {};
|
||||
|
||||
/**
|
||||
* Fired when the task stops
|
||||
*/
|
||||
virtual void onStop() {};
|
||||
|
||||
/**
|
||||
* Starts the task
|
||||
*/
|
||||
void start();
|
||||
|
||||
/**
|
||||
* Fires the task immediately and delays the
|
||||
* next run
|
||||
*/
|
||||
void fireNow();
|
||||
|
||||
/**
|
||||
* Pauses the task without deleting it
|
||||
*/
|
||||
void pause();
|
||||
|
||||
/**
|
||||
* Stops and deletes the task
|
||||
*/
|
||||
void stop();
|
||||
|
||||
retro_time_t getInterval();
|
||||
retro_time_t getLastRun();
|
||||
|
||||
bool isRunning();
|
||||
bool isStopRequested();
|
||||
};
|
||||
|
||||
} // namespace brls
|
||||
68
lib/borealis/library/include/borealis/scroll_view.hpp
Normal file
68
lib/borealis/library/include/borealis/scroll_view.hpp
Normal file
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2020 natinusala
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <borealis/view.hpp>
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
// TODO: horizontal scrolling, either in ScrollView or in a separate class (like Android has)
|
||||
// TODO: Scrollbar
|
||||
|
||||
// A view that automatically scrolls vertically
|
||||
// when one of its children gains focus
|
||||
class ScrollView : public View
|
||||
{
|
||||
private:
|
||||
View* contentView = nullptr;
|
||||
|
||||
bool ready = false; // has layout been called at least once?
|
||||
|
||||
unsigned middleY = 0; // y + height/2
|
||||
unsigned bottomY = 0; // y + height
|
||||
|
||||
float scrollY = 0.0f; // from 0.0f to 1.0f, in % of content view height
|
||||
|
||||
float scrollBarAlpha = Application::getTheme()->scrollBarAlphaNormal;
|
||||
|
||||
bool updateScrollingOnNextLayout = false;
|
||||
bool updateScrollingOnNextFrame = false;
|
||||
|
||||
unsigned getYCenter(View* view);
|
||||
|
||||
void prebakeScrolling();
|
||||
bool updateScrolling(bool animated);
|
||||
void startScrolling(bool animated, float newScroll);
|
||||
void scrollAnimationTick();
|
||||
|
||||
public:
|
||||
~ScrollView();
|
||||
|
||||
void draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, Style* style, FrameContext* ctx) override;
|
||||
void layout(NVGcontext* vg, Style* style, FontStash* stash) override;
|
||||
void willAppear(bool resetState = false) override;
|
||||
void willDisappear(bool resetState = false) override;
|
||||
View* getDefaultFocus() override;
|
||||
void onChildFocusGained(View* child) override;
|
||||
void onWindowSizeChanged() override;
|
||||
|
||||
void setContentView(View* view);
|
||||
View* getContentView();
|
||||
};
|
||||
|
||||
} // namespace brls
|
||||
95
lib/borealis/library/include/borealis/sidebar.hpp
Normal file
95
lib/borealis/library/include/borealis/sidebar.hpp
Normal file
@@ -0,0 +1,95 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019 natinusala
|
||||
Copyright (C) 2019 p-sam
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <borealis/box_layout.hpp>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
// A sidebar with multiple tabs
|
||||
class SidebarSeparator : public View
|
||||
{
|
||||
public:
|
||||
SidebarSeparator();
|
||||
|
||||
void draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, Style* style, FrameContext* ctx) override;
|
||||
};
|
||||
|
||||
class Sidebar;
|
||||
|
||||
// TODO: Use a Label view with integrated ticker for label and sublabel, have the label always tick when active
|
||||
class SidebarItem : public View
|
||||
{
|
||||
private:
|
||||
std::string label;
|
||||
bool active = false;
|
||||
|
||||
Sidebar* sidebar = nullptr;
|
||||
View* associatedView = nullptr;
|
||||
|
||||
ViewType viewType = ViewType::SIDEBARITEM;
|
||||
|
||||
public:
|
||||
SidebarItem(std::string label, Sidebar* sidebar);
|
||||
|
||||
void draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, Style* style, FrameContext* ctx) override;
|
||||
|
||||
View* getDefaultFocus() override
|
||||
{
|
||||
return this;
|
||||
}
|
||||
|
||||
virtual bool onClick();
|
||||
|
||||
void setActive(bool active);
|
||||
bool isActive();
|
||||
|
||||
void onFocusGained() override;
|
||||
|
||||
void setAssociatedView(View* view);
|
||||
View* getAssociatedView();
|
||||
ViewType getViewType() override;
|
||||
|
||||
~SidebarItem();
|
||||
};
|
||||
|
||||
class Sidebar : public BoxLayout
|
||||
{
|
||||
private:
|
||||
SidebarItem* currentActive = nullptr;
|
||||
|
||||
public:
|
||||
Sidebar();
|
||||
|
||||
SidebarItem* addItem(std::string label, View* view);
|
||||
void addSeparator();
|
||||
|
||||
void setActive(SidebarItem* item);
|
||||
|
||||
View* getDefaultFocus() override;
|
||||
void onChildFocusGained(View* child) override;
|
||||
|
||||
size_t lastFocus = 0;
|
||||
};
|
||||
|
||||
} // namespace brls
|
||||
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019 Billy Laws
|
||||
Copyright (C) 2019 p-sam
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <borealis/applet_frame.hpp>
|
||||
#include <borealis/sidebar.hpp>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
// An applet frame for implementing a stage based app with a progress display in top right
|
||||
class StagedAppletFrame : public AppletFrame
|
||||
{
|
||||
public:
|
||||
StagedAppletFrame();
|
||||
~StagedAppletFrame();
|
||||
|
||||
void draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, Style* style, FrameContext* ctx) override;
|
||||
|
||||
void addStage(View* view);
|
||||
void nextStage();
|
||||
void previousStage();
|
||||
|
||||
unsigned getCurrentStage();
|
||||
unsigned getStagesCount();
|
||||
unsigned isLastStage();
|
||||
|
||||
private:
|
||||
size_t currentStage = 0;
|
||||
std::vector<View*> stageViews;
|
||||
|
||||
void enterStage(int index, bool requestFocus);
|
||||
};
|
||||
|
||||
} // namespace brls
|
||||
332
lib/borealis/library/include/borealis/style.hpp
Normal file
332
lib/borealis/library/include/borealis/style.hpp
Normal file
@@ -0,0 +1,332 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019 natinusala
|
||||
Copyright (C) 2019 WerWolv
|
||||
Copyright (C) 2019 p-sam
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
class Style
|
||||
{
|
||||
public:
|
||||
// AppletFrame
|
||||
struct
|
||||
{
|
||||
unsigned headerHeightRegular;
|
||||
unsigned headerHeightPopup; // PopupFrame
|
||||
unsigned footerHeight;
|
||||
|
||||
unsigned imageLeftPadding;
|
||||
unsigned imageTopPadding;
|
||||
unsigned imageSize;
|
||||
unsigned separatorSpacing;
|
||||
|
||||
unsigned titleSize;
|
||||
unsigned titleStart;
|
||||
unsigned titleOffset;
|
||||
|
||||
unsigned footerTextSize;
|
||||
unsigned footerTextSpacing;
|
||||
|
||||
unsigned slideAnimation;
|
||||
} AppletFrame;
|
||||
|
||||
// Highlight
|
||||
struct
|
||||
{
|
||||
unsigned strokeWidth;
|
||||
float cornerRadius;
|
||||
|
||||
unsigned shadowWidth;
|
||||
unsigned shadowOffset;
|
||||
unsigned shadowFeather;
|
||||
unsigned shadowOpacity;
|
||||
|
||||
unsigned animationDuration;
|
||||
} Highlight;
|
||||
|
||||
// Background
|
||||
struct
|
||||
{
|
||||
unsigned sidebarBorderHeight;
|
||||
} Background;
|
||||
|
||||
// Sidebar
|
||||
struct
|
||||
{
|
||||
unsigned width;
|
||||
unsigned spacing;
|
||||
|
||||
unsigned marginLeft;
|
||||
unsigned marginRight;
|
||||
unsigned marginTop;
|
||||
unsigned marginBottom;
|
||||
|
||||
struct
|
||||
{
|
||||
unsigned height;
|
||||
unsigned textSize;
|
||||
unsigned padding;
|
||||
|
||||
unsigned textOffsetX;
|
||||
unsigned activeMarkerWidth;
|
||||
|
||||
unsigned highlight;
|
||||
} Item;
|
||||
|
||||
struct
|
||||
{
|
||||
unsigned height;
|
||||
} Separator;
|
||||
} Sidebar;
|
||||
|
||||
// List
|
||||
struct
|
||||
{
|
||||
unsigned marginLeftRight;
|
||||
unsigned marginTopBottom;
|
||||
unsigned spacing;
|
||||
|
||||
unsigned scrollBarWidth;
|
||||
unsigned scrollBarRadius;
|
||||
unsigned scrollBarPadding;
|
||||
float scrollBarMinimumHeight;
|
||||
|
||||
// Item
|
||||
struct
|
||||
{
|
||||
unsigned height;
|
||||
unsigned heightWithSubLabel;
|
||||
unsigned valueSize;
|
||||
unsigned padding;
|
||||
unsigned thumbnailPadding;
|
||||
|
||||
unsigned descriptionIndent;
|
||||
unsigned descriptionSpacing;
|
||||
|
||||
unsigned indent;
|
||||
|
||||
unsigned selectRadius;
|
||||
} Item;
|
||||
} List;
|
||||
|
||||
// Label
|
||||
struct
|
||||
{
|
||||
unsigned regularFontSize;
|
||||
unsigned mediumFontSize;
|
||||
unsigned smallFontSize;
|
||||
unsigned descriptionFontSize;
|
||||
unsigned crashFontSize;
|
||||
unsigned buttonFontSize;
|
||||
unsigned listItemFontSize;
|
||||
unsigned notificationFontSize;
|
||||
unsigned dialogFontSize;
|
||||
unsigned hintFontSize;
|
||||
|
||||
float lineHeight;
|
||||
float notificationLineHeight;
|
||||
} Label;
|
||||
|
||||
// CrashFrame
|
||||
struct
|
||||
{
|
||||
float labelWidth; // proportional to frame width, from 0 to 1
|
||||
unsigned boxStrokeWidth;
|
||||
unsigned boxSize;
|
||||
unsigned boxSpacing;
|
||||
unsigned buttonWidth;
|
||||
unsigned buttonHeight;
|
||||
unsigned buttonSpacing;
|
||||
} CrashFrame;
|
||||
|
||||
// Button
|
||||
struct
|
||||
{
|
||||
float cornerRadius;
|
||||
|
||||
unsigned highlightInset;
|
||||
|
||||
float shadowWidth;
|
||||
float shadowFeather;
|
||||
float shadowOpacity;
|
||||
float shadowOffset;
|
||||
|
||||
unsigned borderedBorderThickness;
|
||||
unsigned regularBorderThickness;
|
||||
} Button;
|
||||
|
||||
// TableRow
|
||||
struct
|
||||
{
|
||||
unsigned headerHeight;
|
||||
unsigned headerTextSize;
|
||||
|
||||
unsigned bodyHeight;
|
||||
unsigned bodyIndent;
|
||||
unsigned bodyTextSize;
|
||||
|
||||
unsigned padding;
|
||||
} TableRow;
|
||||
|
||||
// Dropdown
|
||||
struct
|
||||
{
|
||||
unsigned listWidth;
|
||||
unsigned listPadding;
|
||||
|
||||
unsigned listItemHeight;
|
||||
unsigned listItemTextSize;
|
||||
|
||||
unsigned headerHeight;
|
||||
unsigned headerFontSize;
|
||||
unsigned headerPadding;
|
||||
} Dropdown;
|
||||
|
||||
struct
|
||||
{
|
||||
unsigned edgePadding;
|
||||
unsigned separatorSpacing;
|
||||
unsigned footerHeight;
|
||||
unsigned imageLeftPadding;
|
||||
unsigned imageTopPadding;
|
||||
unsigned imageSize;
|
||||
unsigned contentWidth;
|
||||
unsigned contentHeight;
|
||||
|
||||
unsigned headerTextLeftPadding;
|
||||
unsigned headerTextTopPadding;
|
||||
|
||||
unsigned subTitleLeftPadding;
|
||||
unsigned subTitleTopPadding;
|
||||
unsigned subTitleSpacing;
|
||||
|
||||
unsigned subTitleSeparatorLeftPadding;
|
||||
unsigned subTitleSeparatorTopPadding;
|
||||
unsigned subTitleSeparatorHeight;
|
||||
|
||||
unsigned headerFontSize;
|
||||
unsigned subTitleFontSize;
|
||||
} PopupFrame;
|
||||
|
||||
// StagedAppletFrame
|
||||
struct
|
||||
{
|
||||
unsigned progressIndicatorSpacing;
|
||||
unsigned progressIndicatorRadiusUnselected;
|
||||
unsigned progressIndicatorRadiusSelected;
|
||||
unsigned progressIndicatorBorderWidth;
|
||||
} StagedAppletFrame;
|
||||
|
||||
// ProgressSpinner
|
||||
struct
|
||||
{
|
||||
float centerGapMultiplier;
|
||||
float barWidthMultiplier;
|
||||
unsigned animationDuration;
|
||||
} ProgressSpinner;
|
||||
|
||||
// ProgressDisplay
|
||||
struct
|
||||
{
|
||||
unsigned percentageLabelWidth;
|
||||
} ProgressDisplay;
|
||||
|
||||
// Header
|
||||
struct
|
||||
{
|
||||
unsigned height;
|
||||
unsigned padding;
|
||||
|
||||
unsigned rectangleWidth;
|
||||
|
||||
unsigned fontSize;
|
||||
} Header;
|
||||
|
||||
// FramerateCounter
|
||||
struct
|
||||
{
|
||||
unsigned width;
|
||||
unsigned height;
|
||||
} FramerateCounter;
|
||||
|
||||
// ThumbnailSidebar
|
||||
struct
|
||||
{
|
||||
unsigned marginLeftRight;
|
||||
unsigned marginTopBottom;
|
||||
|
||||
unsigned buttonHeight;
|
||||
unsigned buttonMargin;
|
||||
} ThumbnailSidebar;
|
||||
|
||||
// AnimationDuration
|
||||
struct
|
||||
{
|
||||
unsigned show;
|
||||
unsigned showSlide;
|
||||
|
||||
unsigned highlight;
|
||||
unsigned shake;
|
||||
|
||||
unsigned collapse;
|
||||
|
||||
unsigned progress;
|
||||
|
||||
unsigned notificationTimeout;
|
||||
} AnimationDuration;
|
||||
|
||||
// Notification
|
||||
struct
|
||||
{
|
||||
unsigned width;
|
||||
unsigned padding;
|
||||
|
||||
unsigned slideAnimation;
|
||||
} Notification;
|
||||
|
||||
// Dialog
|
||||
struct
|
||||
{
|
||||
unsigned width;
|
||||
unsigned height;
|
||||
|
||||
unsigned paddingTopBottom;
|
||||
unsigned paddingLeftRight;
|
||||
|
||||
float cornerRadius;
|
||||
|
||||
unsigned buttonHeight;
|
||||
unsigned buttonSeparatorHeight;
|
||||
|
||||
float shadowWidth;
|
||||
float shadowFeather;
|
||||
float shadowOpacity;
|
||||
float shadowOffset;
|
||||
} Dialog;
|
||||
};
|
||||
|
||||
class HorizonStyle : public Style
|
||||
{
|
||||
public:
|
||||
HorizonStyle();
|
||||
};
|
||||
|
||||
} // namespace brls
|
||||
48
lib/borealis/library/include/borealis/swkbd.hpp
Normal file
48
lib/borealis/library/include/borealis/swkbd.hpp
Normal file
@@ -0,0 +1,48 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019 WerWolv
|
||||
Copyright (C) 2019 p-sam
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <functional>
|
||||
#include <string>
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
enum KeyboardKeyDisableBitmask
|
||||
{
|
||||
KEYBOARD_DISABLE_NONE = 0,
|
||||
KEYBOARD_DISABLE_SPACE = 1,
|
||||
KEYBOARD_DISABLE_AT = 1 << 1,
|
||||
KEYBOARD_DISABLE_PERCENT = 1 << 2,
|
||||
KEYBOARD_DISABLE_FORWSLASH = 1 << 3,
|
||||
KEYBOARD_DISABLE_BACKSLASH = 1 << 4,
|
||||
KEYBOARD_DISABLE_NUMBERS = 1 << 5,
|
||||
KEYBOARD_DISABLE_DOWNLOADCODE = 1 << 6,
|
||||
KEYBOARD_DISABLE_USERNAME = 1 << 7,
|
||||
};
|
||||
|
||||
class Swkbd
|
||||
{
|
||||
public:
|
||||
static bool openForText(std::function<void(std::string)> f, std::string headerText = "", std::string subText = "", int maxStringLength = 32, std::string initialText = "", int kbdDisableBitmask = KeyboardKeyDisableBitmask::KEYBOARD_DISABLE_NONE, std::string okButton = "", std::string guideText = "", bool isPassword = false);
|
||||
static bool openForNumber(std::function<void(int)> f, std::string headerText = "", std::string subText = "", int maxStringLength = 32, std::string initialText = "", std::string leftButton = "", std::string rightButton = "", int kbdDisableBitmask = KeyboardKeyDisableBitmask::KEYBOARD_DISABLE_NONE, std::string okButton = "", std::string guideText = "", bool isPassword = false);
|
||||
};
|
||||
|
||||
} // namespace brls
|
||||
59
lib/borealis/library/include/borealis/tab_frame.hpp
Normal file
59
lib/borealis/library/include/borealis/tab_frame.hpp
Normal file
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019-2020 natinusala
|
||||
Copyright (C) 2019 p-sam
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <borealis/applet_frame.hpp>
|
||||
#include <borealis/sidebar.hpp>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
// An applet frame containing a sidebar on the left with multiple tabs
|
||||
class TabFrame : public AppletFrame
|
||||
{
|
||||
public:
|
||||
TabFrame();
|
||||
|
||||
/**
|
||||
* Adds a tab with given label and view
|
||||
* All tabs and separators must be added
|
||||
* before the TabFrame is itself added to
|
||||
* the view hierarchy
|
||||
*/
|
||||
void addTab(std::string label, View* view);
|
||||
void addSeparator();
|
||||
|
||||
View* getDefaultFocus() override;
|
||||
|
||||
virtual bool onCancel() override;
|
||||
|
||||
~TabFrame();
|
||||
|
||||
Sidebar* sidebar;
|
||||
private:
|
||||
BoxLayout* layout;
|
||||
View* rightPane = nullptr;
|
||||
|
||||
void switchToView(View* view);
|
||||
};
|
||||
|
||||
} // namespace brls
|
||||
72
lib/borealis/library/include/borealis/table.hpp
Normal file
72
lib/borealis/library/include/borealis/table.hpp
Normal file
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019 natinusala
|
||||
Copyright (C) 2019 p-sam
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <borealis/view.hpp>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
// The type of a Table Row
|
||||
enum class TableRowType
|
||||
{
|
||||
HEADER = 0,
|
||||
BODY
|
||||
};
|
||||
|
||||
// A Table row
|
||||
class TableRow
|
||||
{
|
||||
private:
|
||||
TableRowType type;
|
||||
|
||||
std::string label;
|
||||
std::string value;
|
||||
|
||||
public:
|
||||
TableRow(TableRowType type, std::string label, std::string value = "");
|
||||
|
||||
std::string* getLabel();
|
||||
std::string* getValue();
|
||||
TableRowType getType();
|
||||
|
||||
void setValue(std::string value);
|
||||
};
|
||||
|
||||
// A simple, static two-columns table, as seen in
|
||||
// the Settings app (Internet connection details)
|
||||
// All rows must be added before adding the view
|
||||
// to a layout (it's static)
|
||||
class Table : public View
|
||||
{
|
||||
private:
|
||||
public:
|
||||
std::vector<TableRow*> rows;
|
||||
~Table();
|
||||
|
||||
void draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, Style* style, FrameContext* ctx) override;
|
||||
void layout(NVGcontext* vg, Style* style, FontStash* stash) override;
|
||||
|
||||
TableRow* addRow(TableRowType type, std::string label, std::string value = "");
|
||||
};
|
||||
|
||||
} // namespace brls
|
||||
43
lib/borealis/library/include/borealis/task_manager.hpp
Normal file
43
lib/borealis/library/include/borealis/task_manager.hpp
Normal file
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019 natinusala
|
||||
Copyright (C) 2019 p-sam
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <borealis/repeating_task.hpp>
|
||||
#include <vector>
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
class TaskManager
|
||||
{
|
||||
private:
|
||||
std::vector<RepeatingTask*> repeatingTasks;
|
||||
|
||||
void stopRepeatingTask(RepeatingTask* task);
|
||||
|
||||
public:
|
||||
void frame();
|
||||
|
||||
void registerRepeatingTask(RepeatingTask* task);
|
||||
|
||||
~TaskManager();
|
||||
};
|
||||
|
||||
} // namespace brls
|
||||
149
lib/borealis/library/include/borealis/theme.hpp
Normal file
149
lib/borealis/library/include/borealis/theme.hpp
Normal file
@@ -0,0 +1,149 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019 natinusala
|
||||
Copyright (C) 2019 p-sam
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <nanovg/nanovg.h>
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
enum class ThemeVariant
|
||||
{
|
||||
LIGHT,
|
||||
DARK
|
||||
};
|
||||
|
||||
// A Theme instance contains colors for one variant (light or dark)
|
||||
class Theme
|
||||
{
|
||||
public:
|
||||
float backgroundColor[3]; // gl color
|
||||
NVGcolor backgroundColorRGB;
|
||||
|
||||
NVGcolor textColor;
|
||||
NVGcolor descriptionColor;
|
||||
|
||||
NVGcolor notificationTextColor;
|
||||
NVGcolor backdropColor;
|
||||
|
||||
NVGcolor separatorColor;
|
||||
|
||||
NVGcolor sidebarColor;
|
||||
NVGcolor activeTabColor;
|
||||
NVGcolor sidebarSeparatorColor;
|
||||
|
||||
NVGcolor highlightBackgroundColor;
|
||||
NVGcolor highlightColor1;
|
||||
NVGcolor highlightColor2;
|
||||
|
||||
NVGcolor listItemSeparatorColor;
|
||||
NVGcolor listItemValueColor;
|
||||
NVGcolor listItemFaintValueColor;
|
||||
|
||||
NVGcolor tableEvenBackgroundColor;
|
||||
NVGcolor tableBodyTextColor;
|
||||
|
||||
NVGcolor dropdownBackgroundColor;
|
||||
|
||||
NVGcolor nextStageBulletColor;
|
||||
|
||||
NVGcolor spinnerBarColor;
|
||||
|
||||
NVGcolor headerRectangleColor;
|
||||
|
||||
NVGcolor buttonPrimaryEnabledBackgroundColor;
|
||||
NVGcolor buttonPrimaryDisabledBackgroundColor;
|
||||
NVGcolor buttonPrimaryEnabledTextColor;
|
||||
NVGcolor buttonPrimaryDisabledTextColor;
|
||||
NVGcolor buttonBorderedBorderColor;
|
||||
NVGcolor buttonBorderedTextColor;
|
||||
NVGcolor buttonRegularBackgroundColor;
|
||||
NVGcolor buttonRegularTextColor;
|
||||
NVGcolor buttonRegularBorderColor;
|
||||
|
||||
NVGcolor dialogColor;
|
||||
NVGcolor dialogBackdrop;
|
||||
NVGcolor dialogButtonColor;
|
||||
NVGcolor dialogButtonSeparatorColor;
|
||||
|
||||
NVGcolor scrollBarColor;
|
||||
float scrollBarAlphaNormal;
|
||||
float scrollBarAlphaFull;
|
||||
|
||||
float clickAnimationAlpha;
|
||||
};
|
||||
|
||||
// Helper class to store two Theme variants and get the right one
|
||||
// depending on current system theme
|
||||
template <class LightTheme, class DarkTheme>
|
||||
class GenericThemeVariantsWrapper
|
||||
{
|
||||
private:
|
||||
LightTheme* lightTheme;
|
||||
DarkTheme* darkTheme;
|
||||
|
||||
public:
|
||||
GenericThemeVariantsWrapper(LightTheme* lightTheme, DarkTheme* darkTheme)
|
||||
: lightTheme(lightTheme)
|
||||
, darkTheme(darkTheme)
|
||||
{
|
||||
}
|
||||
|
||||
Theme* getTheme(ThemeVariant currentThemeVariant)
|
||||
{
|
||||
if (currentThemeVariant == ThemeVariant::DARK)
|
||||
return this->darkTheme;
|
||||
|
||||
return this->lightTheme;
|
||||
}
|
||||
|
||||
Theme* getLightTheme()
|
||||
{
|
||||
return this->lightTheme;
|
||||
}
|
||||
|
||||
Theme* getDarkTheme()
|
||||
{
|
||||
return this->darkTheme;
|
||||
}
|
||||
|
||||
~GenericThemeVariantsWrapper()
|
||||
{
|
||||
delete this->lightTheme;
|
||||
delete this->darkTheme;
|
||||
}
|
||||
};
|
||||
|
||||
// Themes variants wrapper specification for built-in library views
|
||||
typedef GenericThemeVariantsWrapper<Theme, Theme> LibraryViewsThemeVariantsWrapper;
|
||||
|
||||
class HorizonLightTheme : public Theme
|
||||
{
|
||||
public:
|
||||
HorizonLightTheme();
|
||||
};
|
||||
|
||||
class HorizonDarkTheme : public Theme
|
||||
{
|
||||
public:
|
||||
HorizonDarkTheme();
|
||||
};
|
||||
|
||||
} // namespace brls
|
||||
77
lib/borealis/library/include/borealis/thumbnail_frame.hpp
Normal file
77
lib/borealis/library/include/borealis/thumbnail_frame.hpp
Normal file
@@ -0,0 +1,77 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019 natinusala
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <borealis/applet_frame.hpp>
|
||||
#include <borealis/box_layout.hpp>
|
||||
#include <borealis/button.hpp>
|
||||
#include <borealis/image.hpp>
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
// The sidebar used in ThumbnailFrame
|
||||
class ThumbnailSidebar : public View
|
||||
{
|
||||
private:
|
||||
Image* image = nullptr;
|
||||
Button* button = nullptr;
|
||||
|
||||
Label* title = nullptr;
|
||||
Label* subTitle = nullptr;
|
||||
|
||||
public:
|
||||
ThumbnailSidebar();
|
||||
~ThumbnailSidebar();
|
||||
|
||||
void draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, Style* style, FrameContext* ctx) override;
|
||||
void layout(NVGcontext* vg, Style* style, FontStash* stash) override;
|
||||
View* getDefaultFocus() override;
|
||||
|
||||
void setThumbnail(std::string imagePath);
|
||||
void setThumbnail(unsigned char* buffer, size_t bufferSize);
|
||||
|
||||
void setTitle(std::string title);
|
||||
void setSubtitle(std::string subTitle);
|
||||
|
||||
Button* getButton();
|
||||
};
|
||||
|
||||
// An applet frame with a sidebar on the right, containing a thumbnail
|
||||
// and a button (similar to the Wi-Fi settings in HOS)
|
||||
class ThumbnailFrame : public AppletFrame
|
||||
{
|
||||
private:
|
||||
ThumbnailSidebar* sidebar = nullptr;
|
||||
BoxLayout* boxLayout = nullptr;
|
||||
|
||||
View* thumbnailContentView = nullptr;
|
||||
|
||||
public:
|
||||
ThumbnailFrame();
|
||||
~ThumbnailFrame();
|
||||
|
||||
void setContentView(View* view) override;
|
||||
ThumbnailSidebar* getSidebar();
|
||||
|
||||
protected:
|
||||
void layout(NVGcontext* vg, Style* style, FontStash* stash) override;
|
||||
};
|
||||
|
||||
} // namespace brls
|
||||
422
lib/borealis/library/include/borealis/view.hpp
Normal file
422
lib/borealis/library/include/borealis/view.hpp
Normal file
@@ -0,0 +1,422 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019-2020 natinusala
|
||||
Copyright (C) 2019 p-sam
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <libretro-common/features/features_cpu.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include <borealis/actions.hpp>
|
||||
#include <borealis/event.hpp>
|
||||
#include <borealis/frame_context.hpp>
|
||||
#include <functional>
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
// The animation to play when
|
||||
// pushing or popping a view
|
||||
// (implemented in Application)
|
||||
enum class ViewAnimation
|
||||
{
|
||||
FADE, // the old view fades away and the new one fades in
|
||||
SLIDE_LEFT, // the old view slides out to the left and the new one slides in from the right
|
||||
SLIDE_RIGHT // inverted SLIDE_LEFT
|
||||
};
|
||||
|
||||
// Focus direction when navigating
|
||||
enum class FocusDirection
|
||||
{
|
||||
UP,
|
||||
DOWN,
|
||||
LEFT,
|
||||
RIGHT
|
||||
};
|
||||
|
||||
// View background
|
||||
enum class ViewBackground
|
||||
{
|
||||
NONE,
|
||||
SIDEBAR,
|
||||
DEBUG,
|
||||
BACKDROP
|
||||
};
|
||||
|
||||
enum class ViewType
|
||||
{
|
||||
VIEW,
|
||||
SIDEBARITEM,
|
||||
};
|
||||
|
||||
extern NVGcolor transparent;
|
||||
|
||||
class View;
|
||||
|
||||
typedef Event<View*> GenericEvent;
|
||||
typedef Event<> VoidEvent;
|
||||
|
||||
// Superclass for all the other views
|
||||
// Lifecycle of a view is :
|
||||
// new -> [willAppear -> willDisappear] -> delete
|
||||
//
|
||||
// Users have do to the new, the rest of the lifecycle is taken
|
||||
// care of by the library
|
||||
//
|
||||
// willAppear and willDisappear can be called zero or multiple times
|
||||
// before deletion (in case of a TabLayout for instance)
|
||||
class View
|
||||
{
|
||||
private:
|
||||
ViewBackground background = ViewBackground::NONE;
|
||||
|
||||
void drawBackground(NVGcontext* vg, FrameContext* ctx, Style* style);
|
||||
void drawHighlight(NVGcontext* vg, Theme* theme, float alpha, Style* style, bool background);
|
||||
|
||||
float highlightAlpha = 0.0f;
|
||||
float clickAnimationAlpha = 0.0f;
|
||||
|
||||
bool dirty = true;
|
||||
|
||||
bool highlightShaking = false;
|
||||
retro_time_t highlightShakeStart;
|
||||
FocusDirection highlightShakeDirection;
|
||||
float highlightShakeAmplitude;
|
||||
|
||||
bool fadeIn = false; // is the fade in animation running?
|
||||
bool forceTranslucent = false;
|
||||
|
||||
Theme* themeOverride = nullptr;
|
||||
|
||||
bool hidden = false;
|
||||
|
||||
std::vector<Action> actions;
|
||||
|
||||
ViewType viewType = ViewType::VIEW;
|
||||
|
||||
/**
|
||||
* Parent user data, typically the index of the view
|
||||
* in the internal layout structure
|
||||
*/
|
||||
void* parentUserdata = nullptr;
|
||||
|
||||
protected:
|
||||
int x = 0;
|
||||
int y = 0;
|
||||
|
||||
unsigned width = 0;
|
||||
unsigned height = 0;
|
||||
|
||||
float collapseState = 1.0f;
|
||||
|
||||
bool focused = false;
|
||||
|
||||
View* parent = nullptr;
|
||||
|
||||
GenericEvent focusEvent;
|
||||
|
||||
virtual unsigned getShowAnimationDuration(ViewAnimation animation);
|
||||
|
||||
virtual void getHighlightInsets(unsigned* top, unsigned* right, unsigned* bottom, unsigned* left)
|
||||
{
|
||||
*top = 0;
|
||||
*right = 0;
|
||||
*bottom = 0;
|
||||
*left = 0;
|
||||
}
|
||||
|
||||
virtual void getHighlightMetrics(Style* style, float* cornerRadius)
|
||||
{
|
||||
*cornerRadius = style->Highlight.cornerRadius;
|
||||
}
|
||||
|
||||
virtual bool isHighlightBackgroundEnabled()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// Helper functions to apply this view's alpha to a color
|
||||
NVGcolor a(NVGcolor color);
|
||||
NVGpaint a(NVGpaint paint);
|
||||
|
||||
NVGcolor RGB(unsigned r, unsigned g, unsigned b)
|
||||
{
|
||||
return this->a(nvgRGB(r, g, b));
|
||||
}
|
||||
|
||||
NVGcolor RGBA(unsigned r, unsigned g, unsigned b, unsigned a)
|
||||
{
|
||||
return this->a(nvgRGBA(r, g, b, a));
|
||||
}
|
||||
|
||||
NVGcolor RGBf(float r, float g, float b)
|
||||
{
|
||||
return this->a(nvgRGBf(r, g, b));
|
||||
}
|
||||
|
||||
NVGcolor RGBAf(float r, float g, float b, float a)
|
||||
{
|
||||
return this->a(nvgRGBAf(r, g, b, a));
|
||||
}
|
||||
|
||||
/**
|
||||
* Should the hint alpha be animated when
|
||||
* pushing the view?
|
||||
*/
|
||||
virtual bool animateHint()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public:
|
||||
void setBoundaries(int x, int y, unsigned width, unsigned height);
|
||||
|
||||
void setBackground(ViewBackground background);
|
||||
|
||||
void setWidth(unsigned width);
|
||||
void setHeight(unsigned height);
|
||||
|
||||
void shakeHighlight(FocusDirection direction);
|
||||
|
||||
int getX();
|
||||
int getY();
|
||||
unsigned getWidth();
|
||||
unsigned getHeight(bool includeCollapse = true);
|
||||
|
||||
void setForceTranslucent(bool translucent);
|
||||
|
||||
void setParent(View* parent, void* parentUserdata = nullptr);
|
||||
View* getParent();
|
||||
bool hasParent();
|
||||
|
||||
void* getParentUserData();
|
||||
|
||||
void registerAction(std::string hintText, Key key, ActionListener actionListener, bool hidden = false);
|
||||
void updateActionHint(Key key, std::string hintText);
|
||||
void setActionAvailable(Key key, bool available);
|
||||
|
||||
virtual void playClickAnimation();
|
||||
|
||||
std::string describe() const { return typeid(*this).name(); }
|
||||
|
||||
const std::vector<Action>& getActions()
|
||||
{
|
||||
return this->actions;
|
||||
}
|
||||
|
||||
virtual ViewType getViewType()
|
||||
{
|
||||
return this->viewType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called each frame
|
||||
* Do not override it to draw your view,
|
||||
* override draw() instead
|
||||
*/
|
||||
virtual void frame(FrameContext* ctx);
|
||||
|
||||
/**
|
||||
* Called by frame() to draw
|
||||
* the view onscreen
|
||||
*/
|
||||
virtual void draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, Style* style, FrameContext* ctx) = 0;
|
||||
|
||||
/**
|
||||
* Triggered when the view has been
|
||||
* resized and needs to layout its
|
||||
* children
|
||||
*/
|
||||
virtual void layout(NVGcontext* vg, Style* style, FontStash* stash)
|
||||
{
|
||||
// Nothing to do
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the view will appear
|
||||
* on screen, before or after layout()
|
||||
*
|
||||
* Can be called if the view has
|
||||
* already appeared, so be careful
|
||||
*/
|
||||
virtual void willAppear(bool resetState = false)
|
||||
{
|
||||
// Nothing to do
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the view will disappear
|
||||
* from the screen
|
||||
*
|
||||
* Can be called if the view has
|
||||
* already disappeared, so be careful
|
||||
*/
|
||||
virtual void willDisappear(bool resetState = false)
|
||||
{
|
||||
// Nothing to do
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the show() animation (fade in)
|
||||
* ends
|
||||
*/
|
||||
virtual void onShowAnimationEnd() {};
|
||||
|
||||
/**
|
||||
* Shows the view (fade in animation)
|
||||
*
|
||||
* Called once when the view is
|
||||
* pushed to the view stack
|
||||
*
|
||||
* Not recursive
|
||||
*/
|
||||
virtual void show(std::function<void(void)> cb, bool animate = true, ViewAnimation animation = ViewAnimation::FADE);
|
||||
|
||||
/**
|
||||
* Hides the view in a collapse animation
|
||||
*/
|
||||
void collapse(bool animated = true);
|
||||
|
||||
bool isCollapsed();
|
||||
|
||||
/**
|
||||
* Shows the view in a expand animation (opposite
|
||||
* of collapse)
|
||||
*/
|
||||
void expand(bool animated = true);
|
||||
|
||||
/**
|
||||
* Hides the view (fade out animation)
|
||||
*
|
||||
* Called if another view is pushed
|
||||
* on top of this one
|
||||
*
|
||||
* Not recursive
|
||||
*/
|
||||
virtual void hide(std::function<void(void)> cb, bool animated = true, ViewAnimation animation = ViewAnimation::FADE);
|
||||
|
||||
bool isHidden();
|
||||
|
||||
/**
|
||||
* Calls layout() on next frame
|
||||
* unless immediate is true in which case
|
||||
* it's called immediately
|
||||
*/
|
||||
void invalidate(bool immediate = false);
|
||||
|
||||
/**
|
||||
* Is this view translucent?
|
||||
*
|
||||
* If you override it please return
|
||||
* <value> || View::isTranslucent()
|
||||
* to keep the fadeIn transition
|
||||
*/
|
||||
virtual bool isTranslucent()
|
||||
{
|
||||
return fadeIn || forceTranslucent;
|
||||
}
|
||||
|
||||
bool isFocused();
|
||||
|
||||
/**
|
||||
* Returns the default view to focus when focusing this view
|
||||
* Typically the view itself or one of its children
|
||||
*
|
||||
* Returning nullptr means that the view is not focusable
|
||||
* (and neither are its children)
|
||||
*
|
||||
* When pressing a key, the flow is :
|
||||
* 1. starting from the currently focused view's parent, traverse the tree upwards and
|
||||
* repeatidly call getNextFocus() on every view until we find a next view to focus or meet the end of the tree
|
||||
* 2. if a view is found, getNextFocus() will internally call getDefaultFocus() for the selected child
|
||||
* 3. give focus to the result, if it exists
|
||||
*/
|
||||
virtual View* getDefaultFocus()
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the next view to focus given the requested direction
|
||||
* and the currently focused view (as parent user data)
|
||||
*
|
||||
* Returning nullptr means that there is no next view to focus
|
||||
* in that direction - getNextFocus will then be called on our
|
||||
* parent if any
|
||||
*/
|
||||
virtual View* getNextFocus(FocusDirection direction, View* currentView)
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fired when focus is gained
|
||||
*/
|
||||
virtual void onFocusGained();
|
||||
|
||||
/**
|
||||
* Fired when focus is lost
|
||||
*/
|
||||
virtual void onFocusLost();
|
||||
|
||||
/**
|
||||
* Fired when focus is gained on one of this view's children
|
||||
*/
|
||||
virtual void onChildFocusGained(View* child)
|
||||
{
|
||||
if (this->hasParent())
|
||||
this->getParent()->onChildFocusGained(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fired when focus is gained on one of this view's children
|
||||
*/
|
||||
virtual void onChildFocusLost(View* child)
|
||||
{
|
||||
if (this->hasParent())
|
||||
this->getParent()->onChildFocusLost(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fired when the window size changes
|
||||
* Not guaranteed to be called before or after layout()
|
||||
*/
|
||||
virtual void onWindowSizeChanged()
|
||||
{
|
||||
// Nothing by default
|
||||
}
|
||||
|
||||
GenericEvent* getFocusEvent();
|
||||
|
||||
float alpha = 1.0f;
|
||||
|
||||
virtual float getAlpha(bool child = false);
|
||||
|
||||
/**
|
||||
* Forces this view and its children to use
|
||||
* the specified theme variant
|
||||
*/
|
||||
void overrideThemeVariant(Theme* newTheme);
|
||||
|
||||
virtual ~View();
|
||||
};
|
||||
|
||||
} // namespace brls
|
||||
83
lib/borealis/library/lib/absolute_layout.cpp
Normal file
83
lib/borealis/library/lib/absolute_layout.cpp
Normal file
@@ -0,0 +1,83 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2020 natinusala
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <borealis/absolute_layout.hpp>
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
void AbsoluteLayout::addView(View* view)
|
||||
{
|
||||
view->setParent(this);
|
||||
|
||||
this->children.push_back(view);
|
||||
this->invalidate();
|
||||
}
|
||||
|
||||
void AbsoluteLayout::draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, Style* style, FrameContext* ctx)
|
||||
{
|
||||
for (View* view : this->children)
|
||||
view->frame(ctx);
|
||||
}
|
||||
|
||||
void AbsoluteLayout::layout(NVGcontext* vg, Style* style, FontStash* stash)
|
||||
{
|
||||
for (View* view : this->children)
|
||||
view->invalidate();
|
||||
}
|
||||
|
||||
void AbsoluteLayout::onWindowSizeChanged()
|
||||
{
|
||||
for (View* view : this->children)
|
||||
view->onWindowSizeChanged();
|
||||
}
|
||||
|
||||
void AbsoluteLayout::willAppear(bool resetState)
|
||||
{
|
||||
for (View* view : this->children)
|
||||
view->willAppear(resetState);
|
||||
}
|
||||
|
||||
void AbsoluteLayout::willDisappear(bool resetState)
|
||||
{
|
||||
for (View* view : this->children)
|
||||
view->willDisappear(resetState);
|
||||
}
|
||||
|
||||
AbsoluteLayout::~AbsoluteLayout()
|
||||
{
|
||||
for (View* view : this->children)
|
||||
delete view;
|
||||
}
|
||||
|
||||
void NavigationMap::add(View* from, FocusDirection direction, View* to)
|
||||
{
|
||||
this->map[std::make_pair(from, direction)] = to;
|
||||
}
|
||||
|
||||
View* NavigationMap::getNextFocus(FocusDirection direction, View* currentView)
|
||||
{
|
||||
std::pair<View*, FocusDirection> key = std::make_pair(currentView, direction);
|
||||
|
||||
if (this->map.count(key) == 0)
|
||||
return nullptr;
|
||||
|
||||
return this->map[key];
|
||||
}
|
||||
|
||||
} // namespace brls
|
||||
933
lib/borealis/library/lib/animations.cpp
Normal file
933
lib/borealis/library/lib/animations.cpp
Normal file
@@ -0,0 +1,933 @@
|
||||
/* RetroArch - A frontend for libretro.
|
||||
* Borealis, a Nintendo Switch UI Library
|
||||
* Copyright (C) 2014-2018 - Jean-André Santoni
|
||||
* Copyright (C) 2011-2018 - Daniel De Matteis
|
||||
* Copyright (C) 2019 - natinusala
|
||||
* Copyright (C) 2019 - p-sam
|
||||
*
|
||||
* RetroArch 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 Found-
|
||||
* ation, either version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* RetroArch 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 RetroArch.
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <libretro-common/compat/strl.h>
|
||||
#include <libretro-common/encodings/utf.h>
|
||||
#include <libretro-common/features/features_cpu.h>
|
||||
#include <libretro-common/retro_assert.h>
|
||||
#include <libretro-common/retro_math.h>
|
||||
#include <libretro-common/retro_miscellaneous.h>
|
||||
#include <libretro-common/string/stdstring.h>
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <borealis/animations.hpp>
|
||||
#include <vector>
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
struct tween
|
||||
{
|
||||
float duration;
|
||||
float running_since;
|
||||
float initial_value;
|
||||
float target_value;
|
||||
float* subject;
|
||||
uintptr_t tag;
|
||||
easing_cb easing;
|
||||
tween_cb cb;
|
||||
tween_cb tick;
|
||||
void* userdata;
|
||||
bool deleted;
|
||||
};
|
||||
|
||||
struct menu_animation
|
||||
{
|
||||
std::vector<tween> list;
|
||||
std::vector<tween> pending;
|
||||
bool pending_deletes;
|
||||
bool in_update;
|
||||
};
|
||||
|
||||
typedef struct menu_animation menu_animation_t;
|
||||
|
||||
#define TICKER_SPEED 333
|
||||
#define TICKER_SLOW_SPEED 1600
|
||||
|
||||
static const char ticker_spacer_default[] = " | ";
|
||||
|
||||
static menu_animation_t anim;
|
||||
static retro_time_t cur_time = 0;
|
||||
static retro_time_t old_time = 0;
|
||||
static uint64_t ticker_idx = 0; /* updated every TICKER_SPEED ms */
|
||||
static uint64_t ticker_slow_idx = 0; /* updated every TICKER_SLOW_SPEED ms */
|
||||
static float delta_time = 0.0f;
|
||||
static bool animation_is_active = false;
|
||||
static bool ticker_is_active = false;
|
||||
|
||||
static double highlight_gradient_x = 0.0f;
|
||||
static double highlight_gradient_y = 0.0f;
|
||||
static double highlight_color = 0.0f;
|
||||
|
||||
/* from https://github.com/kikito/tween.lua/blob/master/tween.lua */
|
||||
|
||||
static float easing_linear(float t, float b, float c, float d)
|
||||
{
|
||||
return c * t / d + b;
|
||||
}
|
||||
|
||||
static float easing_in_out_quad(float t, float b, float c, float d)
|
||||
{
|
||||
t = t / d * 2;
|
||||
if (t < 1)
|
||||
return c / 2 * pow(t, 2) + b;
|
||||
return -c / 2 * ((t - 1) * (t - 3) - 1) + b;
|
||||
}
|
||||
|
||||
static float easing_in_quad(float t, float b, float c, float d)
|
||||
{
|
||||
return c * pow(t / d, 2) + b;
|
||||
}
|
||||
|
||||
static float easing_out_quad(float t, float b, float c, float d)
|
||||
{
|
||||
t = t / d;
|
||||
return -c * t * (t - 2) + b;
|
||||
}
|
||||
|
||||
static float easing_out_in_quad(float t, float b, float c, float d)
|
||||
{
|
||||
if (t < d / 2)
|
||||
return easing_out_quad(t * 2, b, c / 2, d);
|
||||
return easing_in_quad((t * 2) - d, b + c / 2, c / 2, d);
|
||||
}
|
||||
|
||||
static float easing_in_cubic(float t, float b, float c, float d)
|
||||
{
|
||||
return c * pow(t / d, 3) + b;
|
||||
}
|
||||
|
||||
static float easing_out_cubic(float t, float b, float c, float d)
|
||||
{
|
||||
return c * (pow(t / d - 1, 3) + 1) + b;
|
||||
}
|
||||
|
||||
static float easing_in_out_cubic(float t, float b, float c, float d)
|
||||
{
|
||||
t = t / d * 2;
|
||||
if (t < 1)
|
||||
return c / 2 * t * t * t + b;
|
||||
t = t - 2;
|
||||
return c / 2 * (t * t * t + 2) + b;
|
||||
}
|
||||
|
||||
static float easing_out_in_cubic(float t, float b, float c, float d)
|
||||
{
|
||||
if (t < d / 2)
|
||||
return easing_out_cubic(t * 2, b, c / 2, d);
|
||||
return easing_in_cubic((t * 2) - d, b + c / 2, c / 2, d);
|
||||
}
|
||||
|
||||
static float easing_in_quart(float t, float b, float c, float d)
|
||||
{
|
||||
return c * pow(t / d, 4) + b;
|
||||
}
|
||||
|
||||
static float easing_out_quart(float t, float b, float c, float d)
|
||||
{
|
||||
return -c * (pow(t / d - 1, 4) - 1) + b;
|
||||
}
|
||||
|
||||
static float easing_in_out_quart(float t, float b, float c, float d)
|
||||
{
|
||||
t = t / d * 2;
|
||||
if (t < 1)
|
||||
return c / 2 * pow(t, 4) + b;
|
||||
return -c / 2 * (pow(t - 2, 4) - 2) + b;
|
||||
}
|
||||
|
||||
static float easing_out_in_quart(float t, float b, float c, float d)
|
||||
{
|
||||
if (t < d / 2)
|
||||
return easing_out_quart(t * 2, b, c / 2, d);
|
||||
return easing_in_quart((t * 2) - d, b + c / 2, c / 2, d);
|
||||
}
|
||||
|
||||
static float easing_in_quint(float t, float b, float c, float d)
|
||||
{
|
||||
return c * pow(t / d, 5) + b;
|
||||
}
|
||||
|
||||
static float easing_out_quint(float t, float b, float c, float d)
|
||||
{
|
||||
return c * (pow(t / d - 1, 5) + 1) + b;
|
||||
}
|
||||
|
||||
static float easing_in_out_quint(float t, float b, float c, float d)
|
||||
{
|
||||
t = t / d * 2;
|
||||
if (t < 1)
|
||||
return c / 2 * pow(t, 5) + b;
|
||||
return c / 2 * (pow(t - 2, 5) + 2) + b;
|
||||
}
|
||||
|
||||
static float easing_out_in_quint(float t, float b, float c, float d)
|
||||
{
|
||||
if (t < d / 2)
|
||||
return easing_out_quint(t * 2, b, c / 2, d);
|
||||
return easing_in_quint((t * 2) - d, b + c / 2, c / 2, d);
|
||||
}
|
||||
|
||||
static float easing_in_sine(float t, float b, float c, float d)
|
||||
{
|
||||
return -c * cos(t / d * (M_PI / 2)) + c + b;
|
||||
}
|
||||
|
||||
static float easing_out_sine(float t, float b, float c, float d)
|
||||
{
|
||||
return c * sin(t / d * (M_PI / 2)) + b;
|
||||
}
|
||||
|
||||
static float easing_in_out_sine(float t, float b, float c, float d)
|
||||
{
|
||||
return -c / 2 * (cos(M_PI * t / d) - 1) + b;
|
||||
}
|
||||
|
||||
static float easing_out_in_sine(float t, float b, float c, float d)
|
||||
{
|
||||
if (t < d / 2)
|
||||
return easing_out_sine(t * 2, b, c / 2, d);
|
||||
return easing_in_sine((t * 2) - d, b + c / 2, c / 2, d);
|
||||
}
|
||||
|
||||
static float easing_in_expo(float t, float b, float c, float d)
|
||||
{
|
||||
if (t == 0)
|
||||
return b;
|
||||
return c * powf(2, 10 * (t / d - 1)) + b - c * 0.001;
|
||||
}
|
||||
|
||||
static float easing_out_expo(float t, float b, float c, float d)
|
||||
{
|
||||
if (t == d)
|
||||
return b + c;
|
||||
return c * 1.001 * (-powf(2, -10 * t / d) + 1) + b;
|
||||
}
|
||||
|
||||
static float easing_in_out_expo(float t, float b, float c, float d)
|
||||
{
|
||||
if (t == 0)
|
||||
return b;
|
||||
if (t == d)
|
||||
return b + c;
|
||||
t = t / d * 2;
|
||||
if (t < 1)
|
||||
return c / 2 * powf(2, 10 * (t - 1)) + b - c * 0.0005;
|
||||
return c / 2 * 1.0005 * (-powf(2, -10 * (t - 1)) + 2) + b;
|
||||
}
|
||||
|
||||
static float easing_out_in_expo(float t, float b, float c, float d)
|
||||
{
|
||||
if (t < d / 2)
|
||||
return easing_out_expo(t * 2, b, c / 2, d);
|
||||
return easing_in_expo((t * 2) - d, b + c / 2, c / 2, d);
|
||||
}
|
||||
|
||||
static float easing_in_circ(float t, float b, float c, float d)
|
||||
{
|
||||
return (-c * (sqrt(1 - powf(t / d, 2)) - 1) + b);
|
||||
}
|
||||
|
||||
static float easing_out_circ(float t, float b, float c, float d)
|
||||
{
|
||||
return (c * sqrt(1 - powf(t / d - 1, 2)) + b);
|
||||
}
|
||||
|
||||
static float easing_in_out_circ(float t, float b, float c, float d)
|
||||
{
|
||||
t = t / d * 2;
|
||||
if (t < 1)
|
||||
return -c / 2 * (sqrt(1 - t * t) - 1) + b;
|
||||
t = t - 2;
|
||||
return c / 2 * (sqrt(1 - t * t) + 1) + b;
|
||||
}
|
||||
|
||||
static float easing_out_in_circ(float t, float b, float c, float d)
|
||||
{
|
||||
if (t < d / 2)
|
||||
return easing_out_circ(t * 2, b, c / 2, d);
|
||||
return easing_in_circ((t * 2) - d, b + c / 2, c / 2, d);
|
||||
}
|
||||
|
||||
static float easing_out_bounce(float t, float b, float c, float d)
|
||||
{
|
||||
t = t / d;
|
||||
if (t < 1 / 2.75)
|
||||
return c * (7.5625 * t * t) + b;
|
||||
if (t < 2 / 2.75)
|
||||
{
|
||||
t = t - (1.5 / 2.75);
|
||||
return c * (7.5625 * t * t + 0.75) + b;
|
||||
}
|
||||
else if (t < 2.5 / 2.75)
|
||||
{
|
||||
t = t - (2.25 / 2.75);
|
||||
return c * (7.5625 * t * t + 0.9375) + b;
|
||||
}
|
||||
t = t - (2.625 / 2.75);
|
||||
return c * (7.5625 * t * t + 0.984375) + b;
|
||||
}
|
||||
|
||||
static float easing_in_bounce(float t, float b, float c, float d)
|
||||
{
|
||||
return c - easing_out_bounce(d - t, 0, c, d) + b;
|
||||
}
|
||||
|
||||
static float easing_in_out_bounce(float t, float b, float c, float d)
|
||||
{
|
||||
if (t < d / 2)
|
||||
return easing_in_bounce(t * 2, 0, c, d) * 0.5 + b;
|
||||
return easing_out_bounce(t * 2 - d, 0, c, d) * 0.5 + c * .5 + b;
|
||||
}
|
||||
|
||||
static float easing_out_in_bounce(float t, float b, float c, float d)
|
||||
{
|
||||
if (t < d / 2)
|
||||
return easing_out_bounce(t * 2, b, c / 2, d);
|
||||
return easing_in_bounce((t * 2) - d, b + c / 2, c / 2, d);
|
||||
}
|
||||
|
||||
static void menu_animation_ticker_generic(uint64_t idx,
|
||||
size_t max_width, size_t* offset, size_t* width)
|
||||
{
|
||||
int ticker_period = (int)(2 * (*width - max_width) + 4);
|
||||
int phase = idx % ticker_period;
|
||||
|
||||
int phase_left_stop = 2;
|
||||
int phase_left_moving = (int)(phase_left_stop + (*width - max_width));
|
||||
int phase_right_stop = phase_left_moving + 2;
|
||||
|
||||
int left_offset = phase - phase_left_stop;
|
||||
int right_offset = (int)((*width - max_width) - (phase - phase_right_stop));
|
||||
|
||||
if (phase < phase_left_stop)
|
||||
*offset = 0;
|
||||
else if (phase < phase_left_moving)
|
||||
*offset = left_offset;
|
||||
else if (phase < phase_right_stop)
|
||||
*offset = *width - max_width;
|
||||
else
|
||||
*offset = right_offset;
|
||||
|
||||
*width = max_width;
|
||||
}
|
||||
|
||||
static void menu_animation_ticker_loop(uint64_t idx,
|
||||
size_t max_width, size_t str_width, size_t spacer_width,
|
||||
size_t* offset1, size_t* width1,
|
||||
size_t* offset2, size_t* width2,
|
||||
size_t* offset3, size_t* width3)
|
||||
{
|
||||
int ticker_period = (int)(str_width + spacer_width);
|
||||
int phase = idx % ticker_period;
|
||||
|
||||
/* Output offsets/widths are unsigned size_t, but it's
|
||||
* easier to perform the required calculations with ints,
|
||||
* so create some temporary variables... */
|
||||
int offset;
|
||||
int width;
|
||||
|
||||
/* Looping text is composed of up to three strings,
|
||||
* where std::string 1 and 2 are different regions of the
|
||||
* source text and std::string 2 is a spacer:
|
||||
*
|
||||
* |-----max_width-----|
|
||||
* [std::string 1][std::string 2][std::string 3]
|
||||
*
|
||||
* The following implementation could probably be optimised,
|
||||
* but any performance gains would be trivial compared with
|
||||
* all the std::string manipulation that has to happen afterwards...
|
||||
*/
|
||||
|
||||
/* String 1 */
|
||||
offset = (phase < (int)str_width) ? phase : 0;
|
||||
width = (int)(str_width - phase);
|
||||
width = (width < 0) ? 0 : width;
|
||||
width = (width > (int)max_width) ? max_width : width;
|
||||
|
||||
*offset1 = offset;
|
||||
*width1 = width;
|
||||
|
||||
/* String 2 */
|
||||
offset = (int)(phase - str_width);
|
||||
offset = offset < 0 ? 0 : offset;
|
||||
width = (int)(max_width - *width1);
|
||||
width = (width > (int)spacer_width) ? spacer_width : width;
|
||||
width = width - offset;
|
||||
|
||||
*offset2 = offset;
|
||||
*width2 = width;
|
||||
|
||||
/* String 3 */
|
||||
width = max_width - (*width1 + *width2);
|
||||
width = width < 0 ? 0 : width;
|
||||
|
||||
/* Note: offset is always zero here so offset3 is
|
||||
* unnecessary - but include it anyway to preserve
|
||||
* symmetry... */
|
||||
*offset3 = 0;
|
||||
*width3 = width;
|
||||
}
|
||||
|
||||
void menu_animation_init(void)
|
||||
{
|
||||
// Nothing to do
|
||||
}
|
||||
|
||||
void menu_animation_free(void)
|
||||
{
|
||||
anim.list.clear();
|
||||
anim.pending.clear();
|
||||
|
||||
anim.in_update = false;
|
||||
anim.pending_deletes = false;
|
||||
}
|
||||
|
||||
static void menu_delayed_animation_cb(void* userdata)
|
||||
{
|
||||
menu_delayed_animation_t* delayed_animation = (menu_delayed_animation_t*)userdata;
|
||||
|
||||
menu_animation_push(&delayed_animation->entry);
|
||||
|
||||
free(delayed_animation);
|
||||
}
|
||||
|
||||
void menu_animation_push_delayed(unsigned delay, menu_animation_ctx_entry_t* entry)
|
||||
{
|
||||
menu_timer_ctx_entry_t timer_entry;
|
||||
menu_delayed_animation_t* delayed_animation = (menu_delayed_animation_t*)malloc(sizeof(menu_delayed_animation_t));
|
||||
|
||||
delayed_animation->entry.cb = entry->cb;
|
||||
delayed_animation->entry.duration = entry->duration;
|
||||
delayed_animation->entry.easing_enum = entry->easing_enum;
|
||||
delayed_animation->entry.subject = entry->subject;
|
||||
delayed_animation->entry.tag = entry->tag;
|
||||
delayed_animation->entry.target_value = entry->target_value;
|
||||
delayed_animation->entry.tick = entry->tick;
|
||||
delayed_animation->entry.userdata = entry->userdata;
|
||||
|
||||
timer_entry.cb = menu_delayed_animation_cb;
|
||||
timer_entry.tick = NULL;
|
||||
timer_entry.duration = delay;
|
||||
timer_entry.userdata = delayed_animation;
|
||||
|
||||
menu_timer_start(&delayed_animation->timer, &timer_entry);
|
||||
}
|
||||
|
||||
bool menu_animation_push(menu_animation_ctx_entry_t* entry)
|
||||
{
|
||||
struct tween t;
|
||||
|
||||
t.duration = entry->duration;
|
||||
t.running_since = 0;
|
||||
t.initial_value = *entry->subject;
|
||||
t.target_value = entry->target_value;
|
||||
t.subject = entry->subject;
|
||||
t.tag = entry->tag;
|
||||
t.cb = entry->cb;
|
||||
t.tick = entry->tick;
|
||||
t.userdata = entry->userdata;
|
||||
t.easing = NULL;
|
||||
t.deleted = false;
|
||||
|
||||
switch (entry->easing_enum)
|
||||
{
|
||||
case EASING_LINEAR:
|
||||
t.easing = &easing_linear;
|
||||
break;
|
||||
/* Quad */
|
||||
case EASING_IN_QUAD:
|
||||
t.easing = &easing_in_quad;
|
||||
break;
|
||||
case EASING_OUT_QUAD:
|
||||
t.easing = &easing_out_quad;
|
||||
break;
|
||||
case EASING_IN_OUT_QUAD:
|
||||
t.easing = &easing_in_out_quad;
|
||||
break;
|
||||
case EASING_OUT_IN_QUAD:
|
||||
t.easing = &easing_out_in_quad;
|
||||
break;
|
||||
/* Cubic */
|
||||
case EASING_IN_CUBIC:
|
||||
t.easing = &easing_in_cubic;
|
||||
break;
|
||||
case EASING_OUT_CUBIC:
|
||||
t.easing = &easing_out_cubic;
|
||||
break;
|
||||
case EASING_IN_OUT_CUBIC:
|
||||
t.easing = &easing_in_out_cubic;
|
||||
break;
|
||||
case EASING_OUT_IN_CUBIC:
|
||||
t.easing = &easing_out_in_cubic;
|
||||
break;
|
||||
/* Quart */
|
||||
case EASING_IN_QUART:
|
||||
t.easing = &easing_in_quart;
|
||||
break;
|
||||
case EASING_OUT_QUART:
|
||||
t.easing = &easing_out_quart;
|
||||
break;
|
||||
case EASING_IN_OUT_QUART:
|
||||
t.easing = &easing_in_out_quart;
|
||||
break;
|
||||
case EASING_OUT_IN_QUART:
|
||||
t.easing = &easing_out_in_quart;
|
||||
break;
|
||||
/* Quint */
|
||||
case EASING_IN_QUINT:
|
||||
t.easing = &easing_in_quint;
|
||||
break;
|
||||
case EASING_OUT_QUINT:
|
||||
t.easing = &easing_out_quint;
|
||||
break;
|
||||
case EASING_IN_OUT_QUINT:
|
||||
t.easing = &easing_in_out_quint;
|
||||
break;
|
||||
case EASING_OUT_IN_QUINT:
|
||||
t.easing = &easing_out_in_quint;
|
||||
break;
|
||||
/* Sine */
|
||||
case EASING_IN_SINE:
|
||||
t.easing = &easing_in_sine;
|
||||
break;
|
||||
case EASING_OUT_SINE:
|
||||
t.easing = &easing_out_sine;
|
||||
break;
|
||||
case EASING_IN_OUT_SINE:
|
||||
t.easing = &easing_in_out_sine;
|
||||
break;
|
||||
case EASING_OUT_IN_SINE:
|
||||
t.easing = &easing_out_in_sine;
|
||||
break;
|
||||
/* Expo */
|
||||
case EASING_IN_EXPO:
|
||||
t.easing = &easing_in_expo;
|
||||
break;
|
||||
case EASING_OUT_EXPO:
|
||||
t.easing = &easing_out_expo;
|
||||
break;
|
||||
case EASING_IN_OUT_EXPO:
|
||||
t.easing = &easing_in_out_expo;
|
||||
break;
|
||||
case EASING_OUT_IN_EXPO:
|
||||
t.easing = &easing_out_in_expo;
|
||||
break;
|
||||
/* Circ */
|
||||
case EASING_IN_CIRC:
|
||||
t.easing = &easing_in_circ;
|
||||
break;
|
||||
case EASING_OUT_CIRC:
|
||||
t.easing = &easing_out_circ;
|
||||
break;
|
||||
case EASING_IN_OUT_CIRC:
|
||||
t.easing = &easing_in_out_circ;
|
||||
break;
|
||||
case EASING_OUT_IN_CIRC:
|
||||
t.easing = &easing_out_in_circ;
|
||||
break;
|
||||
/* Bounce */
|
||||
case EASING_IN_BOUNCE:
|
||||
t.easing = &easing_in_bounce;
|
||||
break;
|
||||
case EASING_OUT_BOUNCE:
|
||||
t.easing = &easing_out_bounce;
|
||||
break;
|
||||
case EASING_IN_OUT_BOUNCE:
|
||||
t.easing = &easing_in_out_bounce;
|
||||
break;
|
||||
case EASING_OUT_IN_BOUNCE:
|
||||
t.easing = &easing_out_in_bounce;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
/* ignore born dead tweens */
|
||||
if (!t.easing || t.duration == 0 || t.initial_value == t.target_value)
|
||||
return false;
|
||||
|
||||
if (anim.in_update)
|
||||
anim.pending.push_back(t);
|
||||
else
|
||||
anim.list.push_back(t);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void menu_animation_get_highlight(float* gradient_x, float* gradient_y, float* color)
|
||||
{
|
||||
if (gradient_x)
|
||||
*gradient_x = (float)highlight_gradient_x;
|
||||
|
||||
if (gradient_y)
|
||||
*gradient_y = (float)highlight_gradient_y;
|
||||
|
||||
if (color)
|
||||
*color = (float)highlight_color;
|
||||
}
|
||||
|
||||
#define HIGHLIGHT_SPEED 350.0
|
||||
|
||||
static void menu_animation_update_time(bool timedate_enable)
|
||||
{
|
||||
static retro_time_t
|
||||
last_clock_update
|
||||
= 0;
|
||||
static retro_time_t
|
||||
last_ticker_update
|
||||
= 0;
|
||||
static retro_time_t
|
||||
last_ticker_slow_update
|
||||
= 0;
|
||||
|
||||
/* Adjust ticker speed */
|
||||
float speed_factor = 1.0f;
|
||||
unsigned ticker_speed = (unsigned)(((float)TICKER_SPEED / speed_factor) + 0.5);
|
||||
unsigned ticker_slow_speed = (unsigned)(((float)TICKER_SLOW_SPEED / speed_factor) + 0.5);
|
||||
|
||||
cur_time = cpu_features_get_time_usec() / 1000;
|
||||
delta_time = old_time == 0 ? 0 : cur_time - old_time;
|
||||
|
||||
old_time = cur_time;
|
||||
|
||||
highlight_gradient_x = (cos((double)cur_time / HIGHLIGHT_SPEED / 3.0) + 1.0) / 2.0;
|
||||
highlight_gradient_y = (sin((double)cur_time / HIGHLIGHT_SPEED / 3.0) + 1.0) / 2.0;
|
||||
highlight_color = (sin((double)cur_time / HIGHLIGHT_SPEED * 2.0) + 1.0) / 2.0;
|
||||
|
||||
if (((cur_time - last_clock_update) > 1000)
|
||||
&& timedate_enable)
|
||||
{
|
||||
animation_is_active = true;
|
||||
last_clock_update = cur_time;
|
||||
}
|
||||
|
||||
if (ticker_is_active
|
||||
&& cur_time - last_ticker_update >= ticker_speed)
|
||||
{
|
||||
ticker_idx++;
|
||||
last_ticker_update = cur_time;
|
||||
}
|
||||
|
||||
if (ticker_is_active
|
||||
&& cur_time - last_ticker_slow_update >= ticker_slow_speed)
|
||||
{
|
||||
ticker_slow_idx++;
|
||||
last_ticker_slow_update = cur_time;
|
||||
}
|
||||
}
|
||||
|
||||
bool menu_animation_update(void)
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
menu_animation_update_time(false);
|
||||
|
||||
anim.in_update = true;
|
||||
anim.pending_deletes = false;
|
||||
|
||||
for (i = 0; i < anim.list.size(); i++)
|
||||
{
|
||||
struct tween* tween = &anim.list[i];
|
||||
tween->running_since += delta_time;
|
||||
|
||||
*tween->subject = tween->easing(
|
||||
tween->running_since,
|
||||
tween->initial_value,
|
||||
tween->target_value - tween->initial_value,
|
||||
tween->duration);
|
||||
|
||||
if (tween->tick)
|
||||
tween->tick(tween->userdata);
|
||||
|
||||
if (tween->running_since >= tween->duration)
|
||||
{
|
||||
*tween->subject = tween->target_value;
|
||||
|
||||
if (tween->cb)
|
||||
tween->cb(tween->userdata);
|
||||
|
||||
anim.list.erase(anim.list.begin() + i);
|
||||
i--;
|
||||
}
|
||||
}
|
||||
|
||||
if (anim.pending_deletes)
|
||||
{
|
||||
for (i = 0; i < anim.list.size(); i++)
|
||||
{
|
||||
struct tween* tween = &anim.list[i];
|
||||
if (tween->deleted)
|
||||
{
|
||||
anim.list.erase(anim.list.begin() + i);
|
||||
i--;
|
||||
}
|
||||
}
|
||||
anim.pending_deletes = false;
|
||||
}
|
||||
|
||||
if (anim.pending.size() > 0)
|
||||
{
|
||||
anim.list.insert(anim.list.begin(), anim.pending.begin(), anim.pending.end());
|
||||
anim.pending.clear();
|
||||
}
|
||||
|
||||
anim.in_update = false;
|
||||
animation_is_active = anim.list.size() > 0;
|
||||
|
||||
return animation_is_active;
|
||||
}
|
||||
|
||||
bool menu_animation_ticker(menu_animation_ctx_ticker_t* ticker)
|
||||
{
|
||||
size_t str_len = utf8len(ticker->str);
|
||||
|
||||
if (!ticker->spacer)
|
||||
ticker->spacer = ticker_spacer_default;
|
||||
|
||||
if ((size_t)str_len <= ticker->len)
|
||||
{
|
||||
utf8cpy(ticker->s,
|
||||
PATH_MAX_LENGTH,
|
||||
ticker->str,
|
||||
ticker->len);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!ticker->selected)
|
||||
{
|
||||
utf8cpy(ticker->s, PATH_MAX_LENGTH, ticker->str, ticker->len - 3);
|
||||
strlcat(ticker->s, "...", PATH_MAX_LENGTH);
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Note: If we reach this point then str_len > ticker->len
|
||||
* (previously had an unecessary 'if (str_len > ticker->len)'
|
||||
* check here...) */
|
||||
switch (ticker->type_enum)
|
||||
{
|
||||
case TICKER_TYPE_LOOP:
|
||||
{
|
||||
size_t offset1, offset2, offset3;
|
||||
size_t width1, width2, width3;
|
||||
|
||||
/* Horribly oversized temporary buffer
|
||||
* > utf8 support makes this whole thing incredibly
|
||||
* ugly/inefficient. Not much we can do about it... */
|
||||
char tmp[PATH_MAX_LENGTH];
|
||||
|
||||
tmp[0] = '\0';
|
||||
ticker->s[0] = '\0';
|
||||
|
||||
menu_animation_ticker_loop(
|
||||
ticker->idx,
|
||||
ticker->len,
|
||||
str_len, utf8len(ticker->spacer),
|
||||
&offset1, &width1,
|
||||
&offset2, &width2,
|
||||
&offset3, &width3);
|
||||
|
||||
if (width1 > 0)
|
||||
{
|
||||
utf8cpy(
|
||||
ticker->s,
|
||||
PATH_MAX_LENGTH,
|
||||
utf8skip(ticker->str, offset1),
|
||||
width1);
|
||||
}
|
||||
|
||||
if (width2 > 0)
|
||||
{
|
||||
utf8cpy(
|
||||
tmp,
|
||||
PATH_MAX_LENGTH,
|
||||
utf8skip(ticker->spacer, offset2),
|
||||
width2);
|
||||
|
||||
strlcat(ticker->s, tmp, PATH_MAX_LENGTH);
|
||||
}
|
||||
|
||||
if (width3 > 0)
|
||||
{
|
||||
utf8cpy(
|
||||
tmp,
|
||||
PATH_MAX_LENGTH,
|
||||
utf8skip(ticker->str, offset3),
|
||||
width3);
|
||||
|
||||
strlcat(ticker->s, tmp, PATH_MAX_LENGTH);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case TICKER_TYPE_BOUNCE:
|
||||
default:
|
||||
{
|
||||
size_t offset = 0;
|
||||
|
||||
menu_animation_ticker_generic(
|
||||
ticker->idx,
|
||||
ticker->len,
|
||||
&offset,
|
||||
&str_len);
|
||||
|
||||
utf8cpy(
|
||||
ticker->s,
|
||||
PATH_MAX_LENGTH,
|
||||
utf8skip(ticker->str, offset),
|
||||
str_len);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ticker_is_active = true;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool menu_animation_is_active(void)
|
||||
{
|
||||
return animation_is_active || ticker_is_active;
|
||||
}
|
||||
|
||||
bool menu_animation_kill_by_tag(menu_animation_ctx_tag* tag)
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
if (!tag || *tag == (uintptr_t)-1)
|
||||
return false;
|
||||
|
||||
for (i = 0; i < anim.list.size(); ++i)
|
||||
{
|
||||
struct tween* t = &anim.list[i];
|
||||
if (t->tag != *tag)
|
||||
continue;
|
||||
|
||||
if (anim.in_update)
|
||||
{
|
||||
t->deleted = true;
|
||||
anim.pending_deletes = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
anim.list.erase(anim.list.begin() + i);
|
||||
--i;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void menu_animation_kill_by_subject(menu_animation_ctx_subject_t* subject)
|
||||
{
|
||||
unsigned i, j, killed = 0;
|
||||
float** sub = (float**)subject->data;
|
||||
|
||||
for (i = 0; i < anim.list.size() && killed < subject->count; ++i)
|
||||
{
|
||||
struct tween* t = &anim.list[i];
|
||||
|
||||
for (j = 0; j < subject->count; ++j)
|
||||
{
|
||||
if (t->subject != sub[j])
|
||||
continue;
|
||||
|
||||
if (anim.in_update)
|
||||
{
|
||||
t->deleted = true;
|
||||
anim.pending_deletes = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
anim.list.erase(anim.list.begin() + i);
|
||||
--i;
|
||||
}
|
||||
|
||||
killed++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
float menu_animation_get_delta_time(void)
|
||||
{
|
||||
return delta_time;
|
||||
}
|
||||
|
||||
bool menu_animation_ctl(enum menu_animation_ctl_state state, void* data)
|
||||
{
|
||||
switch (state)
|
||||
{
|
||||
case MENU_ANIMATION_CTL_CLEAR_ACTIVE:
|
||||
animation_is_active = false;
|
||||
ticker_is_active = false;
|
||||
break;
|
||||
case MENU_ANIMATION_CTL_SET_ACTIVE:
|
||||
animation_is_active = true;
|
||||
ticker_is_active = true;
|
||||
break;
|
||||
case MENU_ANIMATION_CTL_NONE:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void menu_timer_start(menu_timer_t* timer, menu_timer_ctx_entry_t* timer_entry)
|
||||
{
|
||||
menu_animation_ctx_entry_t entry;
|
||||
menu_animation_ctx_tag tag = (uintptr_t)timer;
|
||||
|
||||
menu_timer_kill(timer);
|
||||
|
||||
*timer = 0.0f;
|
||||
|
||||
entry.easing_enum = EASING_LINEAR;
|
||||
entry.tag = tag;
|
||||
entry.duration = timer_entry->duration;
|
||||
entry.target_value = 1.0f;
|
||||
entry.subject = timer;
|
||||
entry.cb = timer_entry->cb;
|
||||
entry.tick = timer_entry->tick;
|
||||
entry.userdata = timer_entry->userdata;
|
||||
|
||||
menu_animation_push(&entry);
|
||||
}
|
||||
|
||||
void menu_timer_kill(menu_timer_t* timer)
|
||||
{
|
||||
menu_animation_ctx_tag tag = (uintptr_t)timer;
|
||||
menu_animation_kill_by_tag(&tag);
|
||||
}
|
||||
|
||||
uint64_t menu_animation_get_ticker_idx(void)
|
||||
{
|
||||
return ticker_idx;
|
||||
}
|
||||
|
||||
uint64_t menu_animation_get_ticker_slow_idx(void)
|
||||
{
|
||||
return ticker_slow_idx;
|
||||
}
|
||||
|
||||
} // namespace brls
|
||||
430
lib/borealis/library/lib/applet_frame.cpp
Normal file
430
lib/borealis/library/lib/applet_frame.cpp
Normal file
@@ -0,0 +1,430 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019 natinusala
|
||||
Copyright (C) 2019 p-sam
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <borealis/applet_frame.hpp>
|
||||
#include <borealis/application.hpp>
|
||||
#include <borealis/i18n.hpp>
|
||||
|
||||
using namespace brls::i18n::literals;
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
AppletFrame::AppletFrame(bool padLeft, bool padRight)
|
||||
{
|
||||
Style* style = Application::getStyle();
|
||||
|
||||
if (padLeft)
|
||||
this->leftPadding = style->AppletFrame.separatorSpacing;
|
||||
|
||||
if (padRight)
|
||||
this->rightPadding = style->AppletFrame.separatorSpacing;
|
||||
|
||||
this->hint = new Hint();
|
||||
this->hint->setParent(this);
|
||||
|
||||
this->registerAction("brls/hints/back"_i18n, Key::B, [this] { return this->onCancel(); });
|
||||
}
|
||||
|
||||
void AppletFrame::draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, Style* style, FrameContext* ctx)
|
||||
{
|
||||
// Text
|
||||
if (this->headerStyle == HeaderStyle::REGULAR)
|
||||
{
|
||||
// Title
|
||||
NVGcolor titleColor = a(ctx->theme->textColor);
|
||||
|
||||
if (this->contentView)
|
||||
titleColor.a *= this->contentView->getAlpha();
|
||||
|
||||
nvgFillColor(vg, titleColor);
|
||||
nvgFontSize(vg, style->AppletFrame.titleSize);
|
||||
nvgTextAlign(vg, NVG_ALIGN_LEFT | NVG_ALIGN_MIDDLE);
|
||||
nvgFontFaceId(vg, ctx->fontStash->regular);
|
||||
nvgBeginPath(vg);
|
||||
nvgText(vg, x + style->AppletFrame.titleStart, y + style->AppletFrame.headerHeightRegular / 2 + style->AppletFrame.titleOffset, this->title.c_str(), nullptr);
|
||||
|
||||
// Header
|
||||
nvgBeginPath(vg);
|
||||
nvgFillColor(vg, a(ctx->theme->textColor));
|
||||
nvgRect(vg, x + style->AppletFrame.separatorSpacing, y + style->AppletFrame.headerHeightRegular - 1, width - style->AppletFrame.separatorSpacing * 2, 1);
|
||||
nvgFill(vg);
|
||||
}
|
||||
else if (this->headerStyle == HeaderStyle::POPUP)
|
||||
{
|
||||
int x_pos = (this->icon ? (x + style->PopupFrame.subTitleLeftPadding) : (style->PopupFrame.edgePadding + style->PopupFrame.imageLeftPadding));
|
||||
|
||||
// Header Text
|
||||
nvgBeginPath(vg);
|
||||
nvgFillColor(vg, a(ctx->theme->textColor));
|
||||
nvgFontFaceId(vg, ctx->fontStash->regular);
|
||||
nvgFontSize(vg, style->PopupFrame.headerFontSize);
|
||||
nvgTextAlign(vg, NVG_ALIGN_LEFT | NVG_ALIGN_MIDDLE);
|
||||
nvgText(vg, x_pos, y + style->PopupFrame.headerTextTopPadding, this->title.c_str(), nullptr);
|
||||
|
||||
// Sub title text 1
|
||||
if (this->subTitleLeft != "")
|
||||
{
|
||||
nvgBeginPath(vg);
|
||||
nvgFillColor(vg, a(ctx->theme->descriptionColor));
|
||||
nvgFontFaceId(vg, ctx->fontStash->regular);
|
||||
nvgFontSize(vg, style->PopupFrame.subTitleFontSize);
|
||||
nvgTextAlign(vg, NVG_ALIGN_LEFT | NVG_ALIGN_TOP);
|
||||
nvgText(vg, x_pos, y + style->PopupFrame.subTitleTopPadding, this->subTitleLeft.c_str(), nullptr);
|
||||
|
||||
float bounds[4];
|
||||
nvgTextBounds(vg, x, y, this->subTitleLeft.c_str(), nullptr, bounds);
|
||||
|
||||
x_pos += static_cast<int>(bounds[2] - bounds[0]);
|
||||
}
|
||||
|
||||
// Sub title separator
|
||||
if (this->subTitleLeft != "" && this->subTitleRight != "")
|
||||
{
|
||||
x_pos += style->PopupFrame.subTitleSpacing;
|
||||
|
||||
nvgFillColor(vg, a(ctx->theme->descriptionColor)); // we purposely don't apply opacity
|
||||
nvgBeginPath(vg);
|
||||
nvgRect(vg, x_pos,
|
||||
y + style->PopupFrame.subTitleSeparatorTopPadding,
|
||||
1,
|
||||
style->PopupFrame.subTitleSeparatorHeight);
|
||||
nvgFill(vg);
|
||||
|
||||
x_pos += style->PopupFrame.subTitleSpacing;
|
||||
}
|
||||
|
||||
// Sub title text 2
|
||||
if (this->subTitleRight != "")
|
||||
{
|
||||
nvgBeginPath(vg);
|
||||
nvgFillColor(vg, a(ctx->theme->descriptionColor));
|
||||
nvgFontFaceId(vg, ctx->fontStash->regular);
|
||||
nvgFontSize(vg, style->PopupFrame.subTitleFontSize);
|
||||
nvgTextAlign(vg, NVG_ALIGN_LEFT | NVG_ALIGN_TOP);
|
||||
nvgText(vg, x_pos, y + style->PopupFrame.subTitleTopPadding, this->subTitleRight.c_str(), nullptr);
|
||||
}
|
||||
|
||||
// Header
|
||||
nvgBeginPath(vg);
|
||||
nvgRect(vg, x + style->AppletFrame.separatorSpacing, y + style->AppletFrame.headerHeightPopup - 1, width - style->AppletFrame.separatorSpacing * 2, 1);
|
||||
nvgFill(vg);
|
||||
}
|
||||
|
||||
// Footer
|
||||
NVGcolor footerColor = a(ctx->theme->textColor);
|
||||
|
||||
if (this->slideIn)
|
||||
footerColor.a = 0.0f;
|
||||
else if (this->slideOut)
|
||||
footerColor.a = 1.0f;
|
||||
|
||||
nvgFillColor(vg, footerColor);
|
||||
|
||||
std::string* text = &this->footerText;
|
||||
|
||||
if (*text == "")
|
||||
text = Application::getCommonFooter();
|
||||
|
||||
nvgFontSize(vg, style->AppletFrame.footerTextSize);
|
||||
nvgTextAlign(vg, NVG_ALIGN_LEFT | NVG_ALIGN_MIDDLE);
|
||||
nvgBeginPath(vg);
|
||||
nvgText(vg, x + style->AppletFrame.separatorSpacing + style->AppletFrame.footerTextSpacing, y + height - style->AppletFrame.footerHeight / 2, text->c_str(), nullptr);
|
||||
|
||||
// Hint
|
||||
this->hint->frame(ctx);
|
||||
|
||||
// Icon
|
||||
if (this->icon)
|
||||
this->icon->frame(ctx);
|
||||
|
||||
// Separators
|
||||
nvgFillColor(vg, a(ctx->theme->separatorColor));
|
||||
|
||||
// Footer
|
||||
nvgBeginPath(vg);
|
||||
nvgRect(vg, x + style->AppletFrame.separatorSpacing, y + height - style->AppletFrame.footerHeight, width - style->AppletFrame.separatorSpacing * 2, 1);
|
||||
nvgFill(vg);
|
||||
|
||||
// Content view
|
||||
if (contentView)
|
||||
{
|
||||
float slideAlpha = 1.0f - this->contentView->alpha;
|
||||
|
||||
if ((this->slideIn && this->animation == ViewAnimation::SLIDE_LEFT) || (this->slideOut && this->animation == ViewAnimation::SLIDE_RIGHT))
|
||||
slideAlpha = 1.0f - slideAlpha;
|
||||
|
||||
int translation = (int)((float)style->AppletFrame.slideAnimation * slideAlpha);
|
||||
|
||||
if ((this->slideIn && this->animation == ViewAnimation::SLIDE_LEFT) || (this->slideOut && this->animation == ViewAnimation::SLIDE_RIGHT))
|
||||
translation -= style->AppletFrame.slideAnimation;
|
||||
|
||||
if (this->slideOut || this->slideIn)
|
||||
nvgTranslate(vg, -translation, 0);
|
||||
|
||||
contentView->frame(ctx);
|
||||
|
||||
if (this->slideOut || this->slideIn)
|
||||
nvgTranslate(vg, translation, 0);
|
||||
}
|
||||
}
|
||||
|
||||
View* AppletFrame::getDefaultFocus()
|
||||
{
|
||||
if (this->contentView)
|
||||
return this->contentView->getDefaultFocus();
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void AppletFrame::layout(NVGcontext* vg, Style* style, FontStash* stash)
|
||||
{
|
||||
// Icon
|
||||
if (this->icon)
|
||||
{
|
||||
if (this->headerStyle == HeaderStyle::REGULAR)
|
||||
{
|
||||
this->icon->setBoundaries(style->AppletFrame.imageLeftPadding, style->AppletFrame.imageTopPadding, style->AppletFrame.imageSize, style->AppletFrame.imageSize);
|
||||
this->icon->invalidate();
|
||||
}
|
||||
else if (this->headerStyle == HeaderStyle::POPUP)
|
||||
{
|
||||
this->icon->setBoundaries(style->PopupFrame.edgePadding + style->PopupFrame.imageLeftPadding, style->PopupFrame.imageTopPadding, style->PopupFrame.imageSize, style->PopupFrame.imageSize);
|
||||
this->icon->invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
// Content
|
||||
if (this->contentView)
|
||||
{
|
||||
if (this->headerStyle == HeaderStyle::REGULAR)
|
||||
this->contentView->setBoundaries(this->x + leftPadding, this->y + style->AppletFrame.headerHeightRegular, this->width - this->leftPadding - this->rightPadding, this->height - style->AppletFrame.footerHeight - style->AppletFrame.headerHeightRegular);
|
||||
else if (this->headerStyle == HeaderStyle::POPUP)
|
||||
this->contentView->setBoundaries(this->x + leftPadding, this->y + style->AppletFrame.headerHeightPopup, this->width - this->leftPadding - this->rightPadding, this->height - style->AppletFrame.footerHeight - style->AppletFrame.headerHeightPopup);
|
||||
|
||||
this->contentView->invalidate();
|
||||
}
|
||||
|
||||
// Hint
|
||||
// TODO: convert the bottom-left footer into a Label to get its width and avoid clipping with the hint
|
||||
unsigned hintWidth = this->width - style->AppletFrame.separatorSpacing * 2 - style->AppletFrame.footerTextSpacing * 2;
|
||||
|
||||
this->hint->setBoundaries(
|
||||
this->x + this->width - hintWidth - style->AppletFrame.separatorSpacing - style->AppletFrame.footerTextSpacing,
|
||||
this->y + this->height - style->AppletFrame.footerHeight,
|
||||
hintWidth,
|
||||
style->AppletFrame.footerHeight);
|
||||
this->hint->invalidate();
|
||||
}
|
||||
|
||||
void AppletFrame::setContentView(View* view)
|
||||
{
|
||||
this->contentView = view;
|
||||
|
||||
if (this->contentView)
|
||||
{
|
||||
this->contentView->setParent(this);
|
||||
this->contentView->willAppear();
|
||||
}
|
||||
|
||||
this->invalidate();
|
||||
}
|
||||
|
||||
bool AppletFrame::hasContentView()
|
||||
{
|
||||
return this->contentView;
|
||||
}
|
||||
|
||||
void AppletFrame::setTitle(std::string title)
|
||||
{
|
||||
this->title = title;
|
||||
}
|
||||
|
||||
void AppletFrame::setFooterText(std::string footerText)
|
||||
{
|
||||
this->footerText = footerText;
|
||||
}
|
||||
|
||||
void AppletFrame::setSubtitle(std::string left, std::string right)
|
||||
{
|
||||
this->subTitleLeft = left;
|
||||
this->subTitleRight = right;
|
||||
}
|
||||
|
||||
void AppletFrame::setIcon(unsigned char* buffer, size_t bufferSize)
|
||||
{
|
||||
if (!this->icon)
|
||||
{
|
||||
Image* icon = new Image(buffer, bufferSize);
|
||||
icon->setScaleType(ImageScaleType::SCALE);
|
||||
icon->setParent(this);
|
||||
|
||||
this->icon = icon;
|
||||
}
|
||||
else if (Image* icon = dynamic_cast<Image*>(this->icon))
|
||||
{
|
||||
icon->setImage(buffer, bufferSize);
|
||||
}
|
||||
|
||||
this->icon->invalidate();
|
||||
}
|
||||
|
||||
void AppletFrame::setIcon(std::string imagePath)
|
||||
{
|
||||
if (!this->icon)
|
||||
{
|
||||
Image* icon = new Image(imagePath);
|
||||
icon->setScaleType(ImageScaleType::SCALE);
|
||||
icon->setParent(this);
|
||||
|
||||
this->icon = icon;
|
||||
}
|
||||
else if (Image* icon = dynamic_cast<Image*>(this->icon))
|
||||
{
|
||||
icon->setImage(imagePath);
|
||||
}
|
||||
|
||||
this->icon->invalidate();
|
||||
}
|
||||
|
||||
void AppletFrame::setIcon(View* view)
|
||||
{
|
||||
if (this->icon)
|
||||
delete this->icon;
|
||||
|
||||
if (view != nullptr)
|
||||
view->setParent(this);
|
||||
|
||||
this->icon = view;
|
||||
}
|
||||
|
||||
void AppletFrame::setHeaderStyle(HeaderStyle headerStyle)
|
||||
{
|
||||
this->headerStyle = headerStyle;
|
||||
|
||||
this->invalidate();
|
||||
}
|
||||
|
||||
void AppletFrame::rebuildHints()
|
||||
{
|
||||
this->hint->rebuildHints(true);
|
||||
}
|
||||
|
||||
AppletFrame::~AppletFrame()
|
||||
{
|
||||
if (this->contentView)
|
||||
{
|
||||
this->contentView->willDisappear(true);
|
||||
delete this->contentView;
|
||||
}
|
||||
|
||||
if (this->icon)
|
||||
delete this->icon;
|
||||
|
||||
delete this->hint;
|
||||
}
|
||||
|
||||
void AppletFrame::willAppear(bool resetState)
|
||||
{
|
||||
if (this->icon)
|
||||
this->icon->willAppear(resetState);
|
||||
|
||||
if (this->contentView)
|
||||
this->contentView->willAppear(resetState);
|
||||
|
||||
this->hint->willAppear(resetState);
|
||||
}
|
||||
|
||||
void AppletFrame::willDisappear(bool resetState)
|
||||
{
|
||||
if (this->icon)
|
||||
this->icon->willDisappear(resetState);
|
||||
|
||||
if (this->contentView)
|
||||
this->contentView->willDisappear(resetState);
|
||||
|
||||
this->hint->willDisappear(resetState);
|
||||
}
|
||||
|
||||
void AppletFrame::show(std::function<void(void)> cb, bool animated, ViewAnimation animation)
|
||||
{
|
||||
this->animation = animation;
|
||||
|
||||
if (animated && (animation == ViewAnimation::SLIDE_LEFT || animation == ViewAnimation::SLIDE_RIGHT) && this->contentView)
|
||||
{
|
||||
this->slideIn = true;
|
||||
|
||||
this->contentView->show([this]() {
|
||||
this->slideIn = false;
|
||||
},
|
||||
true, animation);
|
||||
}
|
||||
else if (this->contentView && this->contentView->isHidden())
|
||||
{
|
||||
this->contentView->show([]() {}, animated, animation);
|
||||
}
|
||||
|
||||
View::show(cb, animated, animation);
|
||||
}
|
||||
|
||||
void AppletFrame::hide(std::function<void(void)> cb, bool animated, ViewAnimation animation)
|
||||
{
|
||||
this->animation = animation;
|
||||
|
||||
if (animated && (animation == ViewAnimation::SLIDE_LEFT || animation == ViewAnimation::SLIDE_RIGHT) && this->contentView)
|
||||
{
|
||||
this->slideOut = true;
|
||||
|
||||
this->contentView->hide([this, cb]() {
|
||||
this->slideOut = false;
|
||||
},
|
||||
true, animation);
|
||||
}
|
||||
else if (this->contentView && !this->contentView->isHidden())
|
||||
{
|
||||
this->contentView->hide([]() {}, animated, animation);
|
||||
}
|
||||
|
||||
View::hide(cb, animated, animation);
|
||||
}
|
||||
|
||||
bool AppletFrame::onCancel()
|
||||
{
|
||||
/*
|
||||
* TODO: this assumes AppletFrames are used as "activities" in the app, which may be wrong
|
||||
* so we should instead change the view stack to an "activity" stack and have them popped when
|
||||
* the user presses B on the root view of an "activity"
|
||||
*/
|
||||
Application::popView();
|
||||
return true;
|
||||
}
|
||||
|
||||
void AppletFrame::onWindowSizeChanged()
|
||||
{
|
||||
if (this->contentView)
|
||||
this->contentView->onWindowSizeChanged();
|
||||
|
||||
if (this->icon)
|
||||
this->icon->onWindowSizeChanged();
|
||||
|
||||
if (this->hint)
|
||||
this->hint->onWindowSizeChanged();
|
||||
}
|
||||
|
||||
} // namespace brls
|
||||
1189
lib/borealis/library/lib/application.cpp
Normal file
1189
lib/borealis/library/lib/application.cpp
Normal file
File diff suppressed because it is too large
Load Diff
378
lib/borealis/library/lib/box_layout.cpp
Normal file
378
lib/borealis/library/lib/box_layout.cpp
Normal file
@@ -0,0 +1,378 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019 natinusala
|
||||
Copyright (C) 2019 WerWolv
|
||||
Copyright (C) 2019 p-sam
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include <borealis/animations.hpp>
|
||||
#include <borealis/application.hpp>
|
||||
#include <borealis/box_layout.hpp>
|
||||
#include <borealis/logger.hpp>
|
||||
#include <iterator>
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
BoxLayout::BoxLayout(BoxLayoutOrientation orientation, size_t defaultFocus)
|
||||
: orientation(orientation)
|
||||
, originalDefaultFocus(defaultFocus)
|
||||
, defaultFocusedIndex(defaultFocus)
|
||||
{
|
||||
}
|
||||
|
||||
void BoxLayout::draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, Style* style, FrameContext* ctx)
|
||||
{
|
||||
// Draw children
|
||||
for (BoxLayoutChild* child : this->children)
|
||||
child->view->frame(ctx);
|
||||
}
|
||||
|
||||
void BoxLayout::setGravity(BoxLayoutGravity gravity)
|
||||
{
|
||||
this->gravity = gravity;
|
||||
this->invalidate();
|
||||
}
|
||||
|
||||
void BoxLayout::setSpacing(unsigned spacing)
|
||||
{
|
||||
this->spacing = spacing;
|
||||
this->invalidate();
|
||||
}
|
||||
|
||||
unsigned BoxLayout::getSpacing()
|
||||
{
|
||||
return this->spacing;
|
||||
}
|
||||
|
||||
void BoxLayout::setMargins(unsigned top, unsigned right, unsigned bottom, unsigned left)
|
||||
{
|
||||
this->marginBottom = bottom;
|
||||
this->marginLeft = left;
|
||||
this->marginRight = right;
|
||||
this->marginTop = top;
|
||||
this->invalidate();
|
||||
}
|
||||
|
||||
void BoxLayout::setMarginBottom(unsigned bottom)
|
||||
{
|
||||
this->marginBottom = bottom;
|
||||
this->invalidate();
|
||||
}
|
||||
|
||||
size_t BoxLayout::getViewsCount()
|
||||
{
|
||||
return this->children.size();
|
||||
}
|
||||
|
||||
View* BoxLayout::getDefaultFocus()
|
||||
{
|
||||
// Focus default focus first
|
||||
if (this->defaultFocusedIndex < this->children.size())
|
||||
{
|
||||
View* newFocus = this->children[this->defaultFocusedIndex]->view->getDefaultFocus();
|
||||
|
||||
if (newFocus)
|
||||
return newFocus;
|
||||
}
|
||||
|
||||
// Fallback to finding the first focusable view
|
||||
for (size_t i = 0; i < this->children.size(); i++)
|
||||
{
|
||||
View* newFocus = this->children[i]->view->getDefaultFocus();
|
||||
|
||||
if (newFocus)
|
||||
return newFocus;
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
View* BoxLayout::getNextFocus(FocusDirection direction, View* currentView)
|
||||
{
|
||||
void* parentUserData = currentView->getParentUserData();
|
||||
|
||||
// Return nullptr immediately if focus direction mismatches the layout direction
|
||||
if ((this->orientation == BoxLayoutOrientation::HORIZONTAL && direction != FocusDirection::LEFT && direction != FocusDirection::RIGHT) || (this->orientation == BoxLayoutOrientation::VERTICAL && direction != FocusDirection::UP && direction != FocusDirection::DOWN))
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// Traverse the children
|
||||
size_t offset = 1; // which way are we going in the children list
|
||||
|
||||
if ((this->orientation == BoxLayoutOrientation::HORIZONTAL && direction == FocusDirection::LEFT) || (this->orientation == BoxLayoutOrientation::VERTICAL && direction == FocusDirection::UP))
|
||||
{
|
||||
offset = -1;
|
||||
}
|
||||
|
||||
size_t currentFocusIndex = *((size_t*)parentUserData) + offset;
|
||||
View* currentFocus = nullptr;
|
||||
|
||||
while (!currentFocus && currentFocusIndex >= 0 && currentFocusIndex < this->children.size())
|
||||
{
|
||||
currentFocus = this->children[currentFocusIndex]->view->getDefaultFocus();
|
||||
currentFocusIndex += offset;
|
||||
}
|
||||
|
||||
return currentFocus;
|
||||
}
|
||||
|
||||
void BoxLayout::removeView(int index, bool free)
|
||||
{
|
||||
BoxLayoutChild* toRemove = this->children[index];
|
||||
toRemove->view->willDisappear(true);
|
||||
if (free)
|
||||
delete toRemove->view;
|
||||
delete toRemove;
|
||||
this->children.erase(this->children.begin() + index);
|
||||
}
|
||||
|
||||
void BoxLayout::clear(bool free)
|
||||
{
|
||||
while (!this->children.empty())
|
||||
this->removeView(0, free);
|
||||
}
|
||||
|
||||
void BoxLayout::layout(NVGcontext* vg, Style* style, FontStash* stash)
|
||||
{
|
||||
// Vertical orientation
|
||||
if (this->orientation == BoxLayoutOrientation::VERTICAL)
|
||||
{
|
||||
unsigned entriesHeight = 0;
|
||||
int yAdvance = this->y + this->marginTop;
|
||||
|
||||
for (size_t i = 0; i < this->children.size(); i++)
|
||||
{
|
||||
BoxLayoutChild* child = this->children[i];
|
||||
unsigned childHeight = child->view->getHeight();
|
||||
|
||||
if (child->fill)
|
||||
child->view->setBoundaries(this->x + this->marginLeft,
|
||||
yAdvance,
|
||||
this->width - this->marginLeft - this->marginRight,
|
||||
this->y + this->height - yAdvance - this->marginBottom);
|
||||
else
|
||||
child->view->setBoundaries(this->x + this->marginLeft,
|
||||
yAdvance,
|
||||
this->width - this->marginLeft - this->marginRight,
|
||||
child->view->getHeight(false));
|
||||
|
||||
child->view->invalidate(true); // call layout directly in case height is updated
|
||||
childHeight = child->view->getHeight();
|
||||
|
||||
int spacing = (int)this->spacing;
|
||||
View* next = (this->children.size() > 1 && i <= this->children.size() - 2) ? this->children[i + 1]->view : nullptr;
|
||||
|
||||
this->customSpacing(child->view, next, &spacing);
|
||||
|
||||
if (child->view->isCollapsed())
|
||||
spacing = 0;
|
||||
|
||||
if (!child->view->isHidden())
|
||||
entriesHeight += spacing + childHeight;
|
||||
|
||||
yAdvance += spacing + childHeight;
|
||||
}
|
||||
|
||||
// TODO: apply gravity
|
||||
|
||||
// Update height if needed
|
||||
if (this->resize)
|
||||
this->setHeight(entriesHeight - spacing + this->marginTop + this->marginBottom);
|
||||
}
|
||||
// Horizontal orientation
|
||||
else if (this->orientation == BoxLayoutOrientation::HORIZONTAL)
|
||||
{
|
||||
// Layout
|
||||
int xAdvance = this->x + this->marginLeft;
|
||||
for (size_t i = 0; i < this->children.size(); i++)
|
||||
{
|
||||
BoxLayoutChild* child = this->children[i];
|
||||
unsigned childWidth = child->view->getWidth();
|
||||
|
||||
if (child->fill)
|
||||
child->view->setBoundaries(xAdvance,
|
||||
this->y + this->marginTop,
|
||||
this->x + this->width - xAdvance - this->marginRight,
|
||||
this->height - this->marginTop - this->marginBottom);
|
||||
else
|
||||
child->view->setBoundaries(xAdvance,
|
||||
this->y + this->marginTop,
|
||||
childWidth,
|
||||
this->height - this->marginTop - this->marginBottom);
|
||||
|
||||
child->view->invalidate(true); // call layout directly in case width is updated
|
||||
childWidth = child->view->getWidth();
|
||||
|
||||
int spacing = (int)this->spacing;
|
||||
|
||||
View* next = (this->children.size() > 1 && i <= this->children.size() - 2) ? this->children[i + 1]->view : nullptr;
|
||||
|
||||
this->customSpacing(child->view, next, &spacing);
|
||||
|
||||
if (child->view->isCollapsed())
|
||||
spacing = 0;
|
||||
|
||||
xAdvance += spacing + childWidth;
|
||||
}
|
||||
|
||||
// Apply gravity
|
||||
// TODO: more efficient gravity implementation?
|
||||
if (!this->children.empty())
|
||||
{
|
||||
switch (this->gravity)
|
||||
{
|
||||
case BoxLayoutGravity::RIGHT:
|
||||
{
|
||||
// Take the remaining empty space between the last view's
|
||||
// right boundary and ours and push all views by this amount
|
||||
View* lastView = this->children[this->children.size() - 1]->view;
|
||||
|
||||
unsigned lastViewRight = lastView->getX() + lastView->getWidth();
|
||||
unsigned ourRight = this->getX() + this->getWidth();
|
||||
|
||||
if (lastViewRight <= ourRight)
|
||||
{
|
||||
unsigned difference = ourRight - lastViewRight;
|
||||
|
||||
for (BoxLayoutChild* child : this->children)
|
||||
{
|
||||
View* view = child->view;
|
||||
view->setBoundaries(
|
||||
view->getX() + difference,
|
||||
view->getY(),
|
||||
view->getWidth(),
|
||||
view->getHeight());
|
||||
view->invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: update width if needed (introduce entriesWidth)
|
||||
}
|
||||
}
|
||||
|
||||
void BoxLayout::setResize(bool resize)
|
||||
{
|
||||
this->resize = resize;
|
||||
this->invalidate();
|
||||
}
|
||||
|
||||
void BoxLayout::addView(View* view, bool fill, bool resetState)
|
||||
{
|
||||
BoxLayoutChild* child = new BoxLayoutChild();
|
||||
child->view = view;
|
||||
child->fill = fill;
|
||||
|
||||
this->children.push_back(child);
|
||||
|
||||
size_t position = this->children.size() - 1;
|
||||
|
||||
size_t* userdata = (size_t*)malloc(sizeof(size_t));
|
||||
*userdata = position;
|
||||
|
||||
view->setParent(this, userdata);
|
||||
|
||||
view->willAppear(resetState);
|
||||
this->invalidate();
|
||||
}
|
||||
|
||||
View* BoxLayout::getChild(size_t index)
|
||||
{
|
||||
return this->children[index]->view;
|
||||
}
|
||||
|
||||
bool BoxLayout::isEmpty()
|
||||
{
|
||||
return this->children.size() == 0;
|
||||
}
|
||||
|
||||
bool BoxLayout::isChildFocused()
|
||||
{
|
||||
return this->childFocused;
|
||||
}
|
||||
|
||||
void BoxLayout::onChildFocusGained(View* child)
|
||||
{
|
||||
this->childFocused = true;
|
||||
|
||||
// Remember focus if needed
|
||||
if (this->rememberFocus)
|
||||
{
|
||||
size_t index = *((size_t*)child->getParentUserData());
|
||||
this->defaultFocusedIndex = index;
|
||||
}
|
||||
|
||||
View::onChildFocusGained(child);
|
||||
}
|
||||
|
||||
void BoxLayout::onChildFocusLost(View* child)
|
||||
{
|
||||
this->childFocused = false;
|
||||
|
||||
View::onChildFocusLost(child);
|
||||
}
|
||||
|
||||
BoxLayout::~BoxLayout()
|
||||
{
|
||||
for (BoxLayoutChild* child : this->children)
|
||||
{
|
||||
child->view->willDisappear(true);
|
||||
delete child->view;
|
||||
delete child;
|
||||
}
|
||||
|
||||
this->children.clear();
|
||||
}
|
||||
|
||||
void BoxLayout::willAppear(bool resetState)
|
||||
{
|
||||
for (BoxLayoutChild* child : this->children)
|
||||
child->view->willAppear(resetState);
|
||||
}
|
||||
|
||||
void BoxLayout::willDisappear(bool resetState)
|
||||
{
|
||||
for (BoxLayoutChild* child : this->children)
|
||||
child->view->willDisappear(resetState);
|
||||
|
||||
// Reset default focus to original one if needed
|
||||
if (this->rememberFocus)
|
||||
this->defaultFocusedIndex = this->originalDefaultFocus;
|
||||
}
|
||||
|
||||
void BoxLayout::onWindowSizeChanged()
|
||||
{
|
||||
for (BoxLayoutChild* child : this->children)
|
||||
child->view->onWindowSizeChanged();
|
||||
}
|
||||
|
||||
void BoxLayout::setRememberFocus(bool remember)
|
||||
{
|
||||
this->rememberFocus = remember;
|
||||
}
|
||||
|
||||
} // namespace brls
|
||||
251
lib/borealis/library/lib/button.cpp
Normal file
251
lib/borealis/library/lib/button.cpp
Normal file
@@ -0,0 +1,251 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019-2020 natinusala
|
||||
Copyright (C) 2019 p-sam
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <math.h>
|
||||
|
||||
#include <borealis/application.hpp>
|
||||
#include <borealis/button.hpp>
|
||||
#include <borealis/i18n.hpp>
|
||||
|
||||
using namespace brls::i18n::literals;
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
// TODO: Disabled bordered button
|
||||
// TODO: Regular disabled button
|
||||
|
||||
Button::Button(ButtonStyle style)
|
||||
: style(style)
|
||||
{
|
||||
this->registerAction("brls/hints/ok"_i18n, Key::A, [this] { return this->onClick(); });
|
||||
}
|
||||
|
||||
LabelStyle Button::getLabelStyle()
|
||||
{
|
||||
switch (this->style)
|
||||
{
|
||||
case ButtonStyle::BORDERLESS:
|
||||
return LabelStyle::BUTTON_BORDERLESS;
|
||||
case ButtonStyle::DIALOG:
|
||||
return LabelStyle::BUTTON_DIALOG;
|
||||
case ButtonStyle::CRASH:
|
||||
return LabelStyle::CRASH;
|
||||
case ButtonStyle::BORDERED:
|
||||
return LabelStyle::BUTTON_BORDERED;
|
||||
case ButtonStyle::REGULAR:
|
||||
return LabelStyle::BUTTON_REGULAR;
|
||||
case ButtonStyle::PRIMARY:
|
||||
default:
|
||||
if (this->state == ButtonState::DISABLED)
|
||||
return LabelStyle::BUTTON_PRIMARY_DISABLED;
|
||||
else
|
||||
return LabelStyle::BUTTON_PRIMARY;
|
||||
}
|
||||
}
|
||||
|
||||
Button::~Button()
|
||||
{
|
||||
if (this->label != nullptr)
|
||||
delete this->label;
|
||||
if (this->image != nullptr)
|
||||
delete this->image;
|
||||
}
|
||||
|
||||
void Button::layout(NVGcontext* vg, Style* style, FontStash* stash)
|
||||
{
|
||||
unsigned imageWidth = this->label ? this->getHeight() : this->getWidth();
|
||||
unsigned imageHeight = this->getHeight();
|
||||
|
||||
if (!this->image)
|
||||
imageWidth = 0;
|
||||
|
||||
if (this->label != nullptr)
|
||||
{
|
||||
this->label->setWidth(this->getWidth() - imageWidth);
|
||||
this->label->invalidate(true);
|
||||
this->label->setBoundaries(
|
||||
this->x + imageWidth,
|
||||
this->y + this->getHeight() / 2 - this->label->getHeight() / 2,
|
||||
this->label->getWidth(),
|
||||
this->label->getHeight());
|
||||
this->label->invalidate();
|
||||
}
|
||||
if (this->image != nullptr)
|
||||
{
|
||||
this->image->setHeight(imageHeight);
|
||||
this->image->setWidth(imageWidth);
|
||||
this->image->invalidate(true);
|
||||
this->image->setBoundaries(
|
||||
this->x,
|
||||
this->y + this->getHeight() / 2 - this->image->getHeight() / 2,
|
||||
this->image->getWidth(),
|
||||
this->image->getHeight());
|
||||
}
|
||||
}
|
||||
|
||||
Button* Button::setLabel(std::string label)
|
||||
{
|
||||
if (this->label != nullptr)
|
||||
delete this->label;
|
||||
|
||||
this->label = new Label(this->getLabelStyle(), label, true);
|
||||
|
||||
this->label->setHorizontalAlign(NVG_ALIGN_CENTER);
|
||||
this->label->setParent(this);
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
Button* Button::setImage(std::string path)
|
||||
{
|
||||
this->image = new Image(path);
|
||||
this->image->setParent(this);
|
||||
return this;
|
||||
}
|
||||
|
||||
Button* Button::setImage(unsigned char* buffer, size_t bufferSize)
|
||||
{
|
||||
this->image = new Image(buffer, bufferSize);
|
||||
this->image->setParent(this);
|
||||
return this;
|
||||
}
|
||||
|
||||
void Button::setState(ButtonState state)
|
||||
{
|
||||
this->state = state;
|
||||
if (this->label != nullptr)
|
||||
this->label->setStyle(this->getLabelStyle());
|
||||
}
|
||||
|
||||
ButtonState Button::getState()
|
||||
{
|
||||
return this->state;
|
||||
}
|
||||
|
||||
void Button::getHighlightInsets(unsigned* top, unsigned* right, unsigned* bottom, unsigned* left)
|
||||
{
|
||||
if (this->style == ButtonStyle::DIALOG)
|
||||
{
|
||||
View::getHighlightInsets(top, right, bottom, left);
|
||||
*right -= 1;
|
||||
return;
|
||||
}
|
||||
|
||||
Style* style = Application::getStyle();
|
||||
*top = style->Button.highlightInset;
|
||||
*right = style->Button.highlightInset;
|
||||
*bottom = style->Button.highlightInset;
|
||||
*left = style->Button.highlightInset;
|
||||
}
|
||||
|
||||
void Button::draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, Style* style, FrameContext* ctx)
|
||||
{
|
||||
float cornerRadius = this->cornerRadiusOverride ? this->cornerRadiusOverride : (float)style->Button.cornerRadius;
|
||||
|
||||
// Background
|
||||
switch (this->style)
|
||||
{
|
||||
case ButtonStyle::PRIMARY:
|
||||
{
|
||||
nvgFillColor(vg, a(this->state == ButtonState::DISABLED ? ctx->theme->buttonPrimaryDisabledBackgroundColor : ctx->theme->buttonPrimaryEnabledBackgroundColor));
|
||||
nvgBeginPath(vg);
|
||||
nvgRoundedRect(vg, x, y, width, height, cornerRadius);
|
||||
nvgFill(vg);
|
||||
break;
|
||||
}
|
||||
case ButtonStyle::REGULAR:
|
||||
{
|
||||
nvgFillColor(vg, a(ctx->theme->buttonRegularBackgroundColor));
|
||||
nvgBeginPath(vg);
|
||||
nvgRoundedRect(vg, x, y, width, height, cornerRadius);
|
||||
nvgFill(vg);
|
||||
|
||||
nvgStrokeColor(vg, a(ctx->theme->buttonRegularBorderColor));
|
||||
nvgStrokeWidth(vg, style->Button.regularBorderThickness);
|
||||
nvgBeginPath(vg);
|
||||
nvgRoundedRect(vg, x, y, width, height, cornerRadius);
|
||||
nvgStroke(vg);
|
||||
break;
|
||||
}
|
||||
case ButtonStyle::BORDERED:
|
||||
{
|
||||
nvgStrokeColor(vg, a(ctx->theme->buttonBorderedBorderColor));
|
||||
nvgStrokeWidth(vg, style->Button.borderedBorderThickness);
|
||||
nvgBeginPath(vg);
|
||||
nvgRoundedRect(vg, x, y, width, height, cornerRadius);
|
||||
nvgStroke(vg);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
// Shadow
|
||||
if (this->state == ButtonState::ENABLED && (this->style == ButtonStyle::PRIMARY || this->style == ButtonStyle::REGULAR))
|
||||
{
|
||||
float shadowWidth = style->Button.shadowWidth;
|
||||
float shadowFeather = style->Button.shadowFeather;
|
||||
float shadowOpacity = style->Button.shadowOpacity;
|
||||
float shadowOffset = style->Button.shadowOffset;
|
||||
|
||||
NVGpaint shadowPaint = nvgBoxGradient(vg,
|
||||
x, y + shadowWidth,
|
||||
width, height,
|
||||
cornerRadius * 2, shadowFeather,
|
||||
RGBA(0, 0, 0, shadowOpacity * alpha), transparent);
|
||||
|
||||
nvgBeginPath(vg);
|
||||
nvgRect(vg, x - shadowOffset, y - shadowOffset,
|
||||
width + shadowOffset * 2, height + shadowOffset * 3);
|
||||
nvgRoundedRect(vg, x, y, width, height, cornerRadius);
|
||||
nvgPathWinding(vg, NVG_HOLE);
|
||||
nvgFillPaint(vg, shadowPaint);
|
||||
nvgFill(vg);
|
||||
}
|
||||
|
||||
// Label
|
||||
if (this->label != nullptr)
|
||||
this->label->frame(ctx);
|
||||
|
||||
if (this->image != nullptr)
|
||||
this->image->frame(ctx);
|
||||
}
|
||||
|
||||
bool Button::onClick()
|
||||
{
|
||||
if (this->state == ButtonState::DISABLED)
|
||||
return false;
|
||||
|
||||
return this->clickEvent.fire(this);
|
||||
}
|
||||
|
||||
GenericEvent* Button::getClickEvent()
|
||||
{
|
||||
return &this->clickEvent;
|
||||
}
|
||||
|
||||
void Button::setCornerRadius(float cornerRadius)
|
||||
{
|
||||
this->cornerRadiusOverride = cornerRadius;
|
||||
|
||||
if (this->image != nullptr)
|
||||
this->image->setCornerRadius(cornerRadius);
|
||||
}
|
||||
} // namespace brls
|
||||
154
lib/borealis/library/lib/crash_frame.cpp
Normal file
154
lib/borealis/library/lib/crash_frame.cpp
Normal file
@@ -0,0 +1,154 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019-2020 natinusala
|
||||
Copyright (C) 2019 p-sam
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <math.h>
|
||||
|
||||
#include <borealis/animations.hpp>
|
||||
#include <borealis/application.hpp>
|
||||
#include <borealis/crash_frame.hpp>
|
||||
#include <borealis/i18n.hpp>
|
||||
|
||||
using namespace brls::i18n::literals;
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
CrashFrame::CrashFrame(std::string text)
|
||||
{
|
||||
// Label
|
||||
this->label = new Label(LabelStyle::CRASH, text, true);
|
||||
this->label->setHorizontalAlign(NVG_ALIGN_CENTER);
|
||||
this->label->setParent(this);
|
||||
|
||||
// Button
|
||||
this->button = (new Button(ButtonStyle::CRASH))->setLabel("brls/crash_frame/button"_i18n);
|
||||
this->button->setParent(this);
|
||||
this->button->alpha = 0.0f;
|
||||
this->button->getClickEvent()->subscribe([](View* view) { Application::quit(); });
|
||||
this->button->overrideThemeVariant(Application::getThemeVariantsWrapper()->getDarkTheme());
|
||||
|
||||
// Hint
|
||||
this->hint = new Hint();
|
||||
this->hint->setParent(this);
|
||||
}
|
||||
|
||||
void CrashFrame::draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, Style* style, FrameContext* ctx)
|
||||
{
|
||||
nvgSave(vg);
|
||||
|
||||
// Background
|
||||
nvgFillColor(vg, RGB(0, 0, 0));
|
||||
nvgBeginPath(vg);
|
||||
nvgRect(vg, x, y, width, height);
|
||||
nvgFill(vg);
|
||||
|
||||
// Scale
|
||||
float scale = (this->alpha + 2.0f) / 3.0f;
|
||||
nvgTranslate(vg, (1.0f - scale) * width * 0.5f, (1.0f - scale) * height * 0.5f);
|
||||
nvgScale(vg, scale, scale);
|
||||
|
||||
// Label
|
||||
this->label->frame(ctx);
|
||||
|
||||
// [!] box
|
||||
unsigned boxSize = style->CrashFrame.boxSize;
|
||||
nvgStrokeColor(vg, RGB(255, 255, 255));
|
||||
nvgStrokeWidth(vg, style->CrashFrame.boxStrokeWidth);
|
||||
nvgBeginPath(vg);
|
||||
nvgRect(vg, x + width / 2 - boxSize / 2, y + style->CrashFrame.boxSpacing, boxSize, boxSize);
|
||||
nvgStroke(vg);
|
||||
|
||||
nvgFillColor(vg, RGB(255, 255, 255));
|
||||
|
||||
nvgFontSize(vg, (float)style->CrashFrame.boxSize / 1.25f);
|
||||
nvgTextAlign(vg, NVG_ALIGN_CENTER | NVG_ALIGN_MIDDLE);
|
||||
nvgBeginPath(vg);
|
||||
nvgText(vg, x + width / 2, y + style->CrashFrame.boxSpacing + boxSize / 2, "!", nullptr);
|
||||
nvgFill(vg);
|
||||
|
||||
// End scale
|
||||
nvgResetTransform(vg);
|
||||
nvgRestore(vg);
|
||||
|
||||
// Footer
|
||||
nvgBeginPath(vg);
|
||||
nvgRect(vg, x + style->AppletFrame.separatorSpacing, y + height - style->AppletFrame.footerHeight, width - style->AppletFrame.separatorSpacing * 2, 1);
|
||||
nvgFill(vg);
|
||||
|
||||
nvgFontSize(vg, style->AppletFrame.footerTextSize);
|
||||
nvgTextAlign(vg, NVG_ALIGN_LEFT | NVG_ALIGN_MIDDLE);
|
||||
nvgBeginPath(vg);
|
||||
nvgText(vg, x + style->AppletFrame.separatorSpacing + style->AppletFrame.footerTextSpacing, y + height - style->AppletFrame.footerHeight / 2, Application::getTitle().c_str(), nullptr);
|
||||
|
||||
// Button
|
||||
this->button->frame(ctx);
|
||||
|
||||
// Hint
|
||||
this->hint->frame(ctx);
|
||||
}
|
||||
|
||||
void CrashFrame::onShowAnimationEnd()
|
||||
{
|
||||
this->button->show([]() {});
|
||||
}
|
||||
|
||||
View* CrashFrame::getDefaultFocus()
|
||||
{
|
||||
return this->button->getDefaultFocus();
|
||||
}
|
||||
|
||||
void CrashFrame::layout(NVGcontext* vg, Style* style, FontStash* stash)
|
||||
{
|
||||
// Label
|
||||
this->label->setWidth(roundf((float)this->width * style->CrashFrame.labelWidth));
|
||||
this->label->invalidate(true);
|
||||
|
||||
this->label->setBoundaries(
|
||||
this->x + this->width / 2 - this->label->getWidth() / 2,
|
||||
this->y + (this->height - style->AppletFrame.footerHeight) / 2,
|
||||
this->label->getWidth(),
|
||||
this->label->getHeight());
|
||||
|
||||
// Button
|
||||
this->button->setBoundaries(
|
||||
this->x + this->width / 2 - style->CrashFrame.buttonWidth / 2,
|
||||
this->y + this->height - style->AppletFrame.footerHeight - style->CrashFrame.boxSpacing - style->CrashFrame.buttonHeight,
|
||||
style->CrashFrame.buttonWidth,
|
||||
style->CrashFrame.buttonHeight);
|
||||
this->button->invalidate();
|
||||
|
||||
// Hint
|
||||
// TODO: convert the bottom-left footer into a Label to get its width and avoid clipping with the hint
|
||||
unsigned hintWidth = this->width - style->AppletFrame.separatorSpacing * 2 - style->AppletFrame.footerTextSpacing * 2;
|
||||
|
||||
this->hint->setBoundaries(
|
||||
this->x + this->width - hintWidth - style->AppletFrame.separatorSpacing - style->AppletFrame.footerTextSpacing,
|
||||
this->y + this->height - style->AppletFrame.footerHeight,
|
||||
hintWidth,
|
||||
style->AppletFrame.footerHeight);
|
||||
this->hint->invalidate();
|
||||
}
|
||||
|
||||
CrashFrame::~CrashFrame()
|
||||
{
|
||||
delete this->label;
|
||||
delete this->hint;
|
||||
}
|
||||
|
||||
} // namespace brls
|
||||
345
lib/borealis/library/lib/dialog.cpp
Normal file
345
lib/borealis/library/lib/dialog.cpp
Normal file
@@ -0,0 +1,345 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019-2020 natinusala
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <borealis/application.hpp>
|
||||
#include <borealis/button.hpp>
|
||||
#include <borealis/dialog.hpp>
|
||||
#include <borealis/i18n.hpp>
|
||||
|
||||
using namespace brls::i18n::literals;
|
||||
|
||||
// TODO: different open animation?
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
Dialog::Dialog(View* contentView)
|
||||
: contentView(contentView)
|
||||
{
|
||||
if (contentView)
|
||||
contentView->setParent(this);
|
||||
|
||||
this->registerAction("brls/hints/back"_i18n, Key::B, [this] { return this->onCancel(); });
|
||||
}
|
||||
|
||||
Dialog::Dialog(std::string text)
|
||||
: Dialog(new Label(LabelStyle::DIALOG, text, true))
|
||||
{
|
||||
}
|
||||
|
||||
void Dialog::addButton(std::string label, GenericEvent::Callback cb)
|
||||
{
|
||||
if (this->buttons.size() >= 3)
|
||||
return;
|
||||
|
||||
DialogButton* button = new DialogButton();
|
||||
button->label = label;
|
||||
button->cb = cb;
|
||||
|
||||
this->buttons.push_back(button);
|
||||
|
||||
this->rebuildButtons();
|
||||
this->invalidate();
|
||||
}
|
||||
|
||||
void Dialog::open()
|
||||
{
|
||||
Application::pushView(this);
|
||||
|
||||
if (this->buttons.size() == 0)
|
||||
Application::blockInputs();
|
||||
}
|
||||
|
||||
// TODO: do something better in case another view was pushed in the meantime
|
||||
void Dialog::close(std::function<void(void)> cb)
|
||||
{
|
||||
Application::popView(ViewAnimation::FADE, cb);
|
||||
|
||||
if (this->buttons.size() == 0)
|
||||
Application::unblockInputs();
|
||||
}
|
||||
|
||||
void Dialog::setCancelable(bool cancelable)
|
||||
{
|
||||
this->cancelable = cancelable;
|
||||
}
|
||||
|
||||
void Dialog::draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, Style* style, FrameContext* ctx)
|
||||
{
|
||||
// Backdrop
|
||||
nvgFillColor(vg, a(ctx->theme->dialogBackdrop));
|
||||
nvgBeginPath(vg);
|
||||
nvgRect(vg, x, y, width, height);
|
||||
nvgFill(vg);
|
||||
|
||||
// Shadow
|
||||
float shadowWidth = style->Dialog.shadowWidth;
|
||||
float shadowFeather = style->Dialog.shadowFeather;
|
||||
float shadowOpacity = style->Dialog.shadowOpacity;
|
||||
float shadowOffset = style->Dialog.shadowOffset;
|
||||
|
||||
NVGpaint shadowPaint = nvgBoxGradient(vg,
|
||||
this->frameX, this->frameY + shadowWidth,
|
||||
this->frameWidth, this->frameHeight,
|
||||
style->Dialog.cornerRadius * 2, shadowFeather,
|
||||
RGBA(0, 0, 0, shadowOpacity * alpha), transparent);
|
||||
|
||||
nvgBeginPath(vg);
|
||||
nvgRect(vg, this->frameX - shadowOffset, this->frameY - shadowOffset,
|
||||
this->frameWidth + shadowOffset * 2, this->frameHeight + shadowOffset * 3);
|
||||
nvgRoundedRect(vg, this->frameX, this->frameY, this->frameWidth, this->frameHeight, style->Dialog.cornerRadius);
|
||||
nvgPathWinding(vg, NVG_HOLE);
|
||||
nvgFillPaint(vg, shadowPaint);
|
||||
nvgFill(vg);
|
||||
|
||||
// Frame
|
||||
nvgFillColor(vg, a(ctx->theme->dialogColor));
|
||||
nvgBeginPath(vg);
|
||||
nvgRoundedRect(vg, this->frameX, this->frameY, this->frameWidth, this->frameHeight, style->Dialog.cornerRadius);
|
||||
nvgFill(vg);
|
||||
|
||||
// Content view
|
||||
if (this->contentView)
|
||||
this->contentView->frame(ctx);
|
||||
|
||||
// Buttons separator
|
||||
if (this->buttons.size() > 0)
|
||||
{
|
||||
unsigned buttonsHeight = this->getButtonsHeight();
|
||||
nvgFillColor(vg, a(ctx->theme->dialogButtonSeparatorColor));
|
||||
|
||||
// First vertical separator
|
||||
nvgBeginPath(vg);
|
||||
nvgRect(vg, this->frameX, this->frameY + this->frameHeight - buttonsHeight, this->frameWidth, style->Dialog.buttonSeparatorHeight);
|
||||
nvgFill(vg);
|
||||
|
||||
// Second vertical separator
|
||||
if (this->buttons.size() == 3)
|
||||
{
|
||||
nvgBeginPath(vg);
|
||||
nvgRect(vg, this->frameX, this->frameY + this->frameHeight - style->Dialog.buttonHeight, this->frameWidth, style->Dialog.buttonSeparatorHeight);
|
||||
nvgFill(vg);
|
||||
}
|
||||
|
||||
// Horizontal separator
|
||||
if (this->buttons.size() >= 2)
|
||||
{
|
||||
nvgBeginPath(vg);
|
||||
nvgRect(
|
||||
vg,
|
||||
this->frameX + this->frameWidth / 2 + style->Dialog.buttonSeparatorHeight / 2,
|
||||
this->frameY + this->frameHeight - style->Dialog.buttonHeight + 1, // offset by 1 to fix aliasing artifact
|
||||
style->Dialog.buttonSeparatorHeight,
|
||||
style->Dialog.buttonHeight - 1);
|
||||
nvgFill(vg);
|
||||
}
|
||||
}
|
||||
|
||||
// Buttons
|
||||
if (this->verticalButtonsLayout)
|
||||
this->verticalButtonsLayout->frame(ctx);
|
||||
}
|
||||
|
||||
View* Dialog::getDefaultFocus()
|
||||
{
|
||||
if (this->buttons.size() > 0 && this->verticalButtonsLayout)
|
||||
return this->verticalButtonsLayout->getDefaultFocus();
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
bool Dialog::onCancel()
|
||||
{
|
||||
if (this->cancelable)
|
||||
this->close();
|
||||
|
||||
return this->cancelable;
|
||||
}
|
||||
|
||||
unsigned Dialog::getButtonsHeight()
|
||||
{
|
||||
Style* style = Application::getStyle();
|
||||
if (this->buttons.size() == 3)
|
||||
return style->Dialog.buttonHeight * 2;
|
||||
else if (this->buttons.size() > 0) // 1 or 2
|
||||
return style->Dialog.buttonHeight;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
void Dialog::layout(NVGcontext* vg, Style* style, FontStash* stash)
|
||||
{
|
||||
this->frameWidth = style->Dialog.width;
|
||||
this->frameHeight = style->Dialog.height;
|
||||
|
||||
unsigned buttonsHeight = this->getButtonsHeight();
|
||||
this->frameHeight += buttonsHeight;
|
||||
|
||||
this->frameX = getWidth() / 2 - this->frameWidth / 2;
|
||||
this->frameY = getHeight() / 2 - this->frameHeight / 2;
|
||||
|
||||
unsigned contentX = this->frameX + style->Dialog.paddingLeftRight;
|
||||
unsigned contentY = this->frameY + style->Dialog.paddingTopBottom;
|
||||
unsigned contentWidth = this->frameWidth - style->Dialog.paddingLeftRight * 2;
|
||||
unsigned contentHeight = this->frameHeight - style->Dialog.paddingTopBottom * 2 - buttonsHeight;
|
||||
|
||||
if (this->contentView)
|
||||
{
|
||||
// First layout to get height
|
||||
this->contentView->setBoundaries(
|
||||
contentX,
|
||||
contentY,
|
||||
contentWidth,
|
||||
contentHeight);
|
||||
|
||||
this->contentView->invalidate(true); // layout directly to get height
|
||||
|
||||
// Center the content view in the dialog
|
||||
// or resize it if needed
|
||||
unsigned newContentHeight = this->contentView->getHeight();
|
||||
|
||||
int difference = contentHeight - newContentHeight;
|
||||
|
||||
if (difference < 0)
|
||||
{
|
||||
this->frameHeight += -difference;
|
||||
}
|
||||
else
|
||||
{
|
||||
contentY += difference / 2;
|
||||
|
||||
this->contentView->setBoundaries(
|
||||
contentX,
|
||||
contentY,
|
||||
contentWidth,
|
||||
contentHeight);
|
||||
|
||||
this->contentView->invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
// Buttons
|
||||
if (this->verticalButtonsLayout)
|
||||
{
|
||||
this->verticalButtonsLayout->setBoundaries(
|
||||
this->frameX,
|
||||
this->frameY + this->frameHeight - buttonsHeight,
|
||||
this->frameWidth,
|
||||
style->Dialog.buttonHeight);
|
||||
|
||||
// Only one big button
|
||||
if (this->buttons.size() == 1)
|
||||
{
|
||||
this->verticalButtonsLayout->getChild(0)->setHeight(style->Dialog.buttonHeight);
|
||||
}
|
||||
// Two buttons on one row
|
||||
else if (this->buttons.size() == 2)
|
||||
{
|
||||
this->horizontalButtonsLayout->setHeight(style->Dialog.buttonHeight);
|
||||
|
||||
this->horizontalButtonsLayout->getChild(0)->setWidth(this->frameWidth / 2);
|
||||
this->horizontalButtonsLayout->getChild(1)->setWidth(this->frameWidth / 2);
|
||||
}
|
||||
// Two rows: one with one button and one with two
|
||||
else if (this->buttons.size() == 3)
|
||||
{
|
||||
this->verticalButtonsLayout->getChild(0)->setHeight(style->Dialog.buttonHeight);
|
||||
|
||||
this->horizontalButtonsLayout->setHeight(style->Dialog.buttonHeight);
|
||||
|
||||
this->horizontalButtonsLayout->getChild(0)->setWidth(this->frameWidth / 2);
|
||||
this->horizontalButtonsLayout->getChild(1)->setWidth(this->frameWidth / 2);
|
||||
}
|
||||
|
||||
this->verticalButtonsLayout->invalidate();
|
||||
if (this->horizontalButtonsLayout)
|
||||
this->horizontalButtonsLayout->invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
void Dialog::rebuildButtons()
|
||||
{
|
||||
if (this->verticalButtonsLayout)
|
||||
delete this->verticalButtonsLayout;
|
||||
this->verticalButtonsLayout = nullptr;
|
||||
|
||||
// horizontal box layout will be deleted by
|
||||
// the vertical layout destructor
|
||||
|
||||
if (this->buttons.size() > 0)
|
||||
{
|
||||
this->verticalButtonsLayout = new BoxLayout(BoxLayoutOrientation::VERTICAL);
|
||||
this->verticalButtonsLayout->setParent(this);
|
||||
|
||||
// Only one big button
|
||||
if (this->buttons.size() == 1)
|
||||
{
|
||||
Button* button = (new Button(ButtonStyle::DIALOG))->setLabel(this->buttons[0]->label);
|
||||
button->getClickEvent()->subscribe(this->buttons[0]->cb);
|
||||
this->verticalButtonsLayout->addView(button);
|
||||
}
|
||||
// Two buttons on one row
|
||||
else if (this->buttons.size() == 2)
|
||||
{
|
||||
this->horizontalButtonsLayout = new BoxLayout(BoxLayoutOrientation::HORIZONTAL);
|
||||
this->verticalButtonsLayout->addView(this->horizontalButtonsLayout);
|
||||
|
||||
for (DialogButton* dialogButton : this->buttons)
|
||||
{
|
||||
Button* button = (new Button(ButtonStyle::DIALOG))->setLabel(dialogButton->label);
|
||||
button->getClickEvent()->subscribe(dialogButton->cb);
|
||||
this->horizontalButtonsLayout->addView(button);
|
||||
}
|
||||
}
|
||||
// Two rows: one with one button and one with two
|
||||
else if (this->buttons.size() == 3)
|
||||
{
|
||||
Button* button = (new Button(ButtonStyle::DIALOG))->setLabel(this->buttons[0]->label);
|
||||
button->getClickEvent()->subscribe(this->buttons[0]->cb);
|
||||
this->verticalButtonsLayout->addView(button);
|
||||
|
||||
this->horizontalButtonsLayout = new BoxLayout(BoxLayoutOrientation::HORIZONTAL);
|
||||
this->verticalButtonsLayout->addView(this->horizontalButtonsLayout);
|
||||
|
||||
for (size_t i = 1; i < this->buttons.size(); i++)
|
||||
{
|
||||
DialogButton* dialogButton = this->buttons[i];
|
||||
Button* button = (new Button(ButtonStyle::DIALOG))->setLabel(dialogButton->label);
|
||||
button->getClickEvent()->subscribe(dialogButton->cb);
|
||||
this->horizontalButtonsLayout->addView(button);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Dialog::~Dialog()
|
||||
{
|
||||
if (this->contentView)
|
||||
delete this->contentView;
|
||||
|
||||
if (this->verticalButtonsLayout)
|
||||
delete this->verticalButtonsLayout;
|
||||
|
||||
for (DialogButton* dialogButton : this->buttons)
|
||||
delete dialogButton;
|
||||
|
||||
// horizontal box layout will be deleted by
|
||||
// the vertical layout destructor
|
||||
}
|
||||
|
||||
} // namespace brls
|
||||
217
lib/borealis/library/lib/dropdown.cpp
Normal file
217
lib/borealis/library/lib/dropdown.cpp
Normal file
@@ -0,0 +1,217 @@
|
||||
/*
|
||||
Borealis, a Nintendo Switch UI Library
|
||||
Copyright (C) 2019-2020 natinusala
|
||||
Copyright (C) 2019 p-sam
|
||||
|
||||
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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <borealis/animations.hpp>
|
||||
#include <borealis/application.hpp>
|
||||
#include <borealis/dropdown.hpp>
|
||||
#include <borealis/i18n.hpp>
|
||||
#include <borealis/logger.hpp>
|
||||
|
||||
using namespace brls::i18n::literals;
|
||||
|
||||
#define SELECT_VIEW_MAX_ITEMS 6 // for max height
|
||||
|
||||
#define min(a, b) ((a < b) ? a : b)
|
||||
|
||||
// TODO: Turns out the fade out animation is the same as the fade in (top -> bottom)
|
||||
|
||||
namespace brls
|
||||
{
|
||||
|
||||
Dropdown::Dropdown(std::string title, std::vector<std::string> values, ValueSelectedEvent::Callback cb, size_t selected)
|
||||
: title(title)
|
||||
{
|
||||
Style* style = Application::getStyle();
|
||||
|
||||
this->valueEvent.subscribe(cb);
|
||||
|
||||
this->topOffset = (float)style->Dropdown.listPadding / 8.0f;
|
||||
|
||||
this->valuesCount = values.size();
|
||||
|
||||
this->list = new List(selected);
|
||||
this->list->setParent(this);
|
||||
this->list->setMargins(1, 0, 1, 0);
|
||||
|
||||
for (size_t i = 0; i < values.size(); i++)
|
||||
{
|
||||
std::string value = values[i];
|
||||
|
||||
ListItem* item = new ListItem(value);
|
||||
|
||||
if (i == selected)
|
||||
item->setChecked(true);
|
||||
|
||||
item->setHeight(style->Dropdown.listItemHeight);
|
||||
item->setTextSize(style->Dropdown.listItemTextSize);
|
||||
|
||||
item->getClickEvent()->subscribe([this, i](View* view) {
|
||||
this->valueEvent.fire(i);
|
||||
Application::popView();
|
||||
});
|
||||
|
||||
this->list->addView(item);
|
||||
}
|
||||
|
||||
this->hint = new Hint();
|
||||
this->hint->setParent(this);
|
||||
|
||||
this->registerAction("brls/hints/back"_i18n, Key::B, [this] { return this->onCancel(); });
|
||||
}
|
||||
|
||||
void Dropdown::show(std::function<void(void)> cb, bool animate, ViewAnimation animation)
|
||||
{
|
||||
View::show(cb);
|
||||
|
||||
menu_animation_ctx_entry_t entry;
|
||||
|
||||
entry.duration = this->getShowAnimationDuration(animation);
|
||||
entry.easing_enum = EASING_OUT_QUAD;
|
||||
entry.subject = &this->topOffset;
|
||||
entry.tag = (uintptr_t) nullptr;
|
||||
entry.target_value = 0.0f;
|
||||
entry.tick = [this](void* userdata) { this->invalidate(); };
|
||||
entry.userdata = nullptr;
|
||||
|
||||
menu_animation_push(&entry);
|
||||
}
|
||||
|
||||
void Dropdown::draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, Style* style, FrameContext* ctx)
|
||||
{
|
||||
unsigned top = this->list->getY() - style->Dropdown.headerHeight - style->Dropdown.listPadding;
|
||||
|
||||
// Backdrop
|
||||
nvgFillColor(vg, a(ctx->theme->dropdownBackgroundColor));
|
||||
nvgBeginPath(vg);
|
||||
nvgRect(vg, x, y, width, top);
|
||||
nvgFill(vg);
|
||||
|
||||
// TODO: Shadow
|
||||
|
||||
// Background
|
||||
nvgFillColor(vg, a(ctx->theme->sidebarColor));
|
||||
nvgBeginPath(vg);
|
||||
nvgRect(vg, x, top, width, height - top);
|
||||
nvgFill(vg);
|
||||
|
||||
// List
|
||||
this->list->frame(ctx);
|
||||
|
||||
// Footer
|
||||
this->hint->frame(ctx);
|
||||
|
||||
nvgFillColor(vg, ctx->theme->separatorColor); // we purposely don't apply opacity
|
||||
|
||||
nvgBeginPath(vg);
|
||||
nvgRect(vg, x + style->AppletFrame.separatorSpacing, y + height - style->AppletFrame.footerHeight, width - style->AppletFrame.separatorSpacing * 2, 1);
|
||||
nvgFill(vg);
|
||||
|
||||
nvgFillColor(vg, ctx->theme->textColor); // we purposely don't apply opacity
|
||||
nvgFontSize(vg, style->AppletFrame.footerTextSize);
|
||||
nvgTextAlign(vg, NVG_ALIGN_LEFT | NVG_ALIGN_MIDDLE);
|
||||
nvgBeginPath(vg);
|
||||
nvgText(vg, x + style->AppletFrame.separatorSpacing + style->AppletFrame.footerTextSpacing, y + height - style->AppletFrame.footerHeight / 2, Application::getCommonFooter()->c_str(), nullptr);
|
||||
|
||||
// Header
|
||||
nvgFillColor(vg, a(ctx->theme->separatorColor));
|
||||
nvgBeginPath(vg);
|
||||
nvgRect(vg, x + style->AppletFrame.separatorSpacing, top + style->Dropdown.headerHeight - 1, width - style->AppletFrame.separatorSpacing * 2, 1);
|
||||
nvgFill(vg);
|
||||
|
||||
nvgBeginPath(vg);
|
||||
nvgFillColor(vg, a(ctx->theme->textColor));
|
||||
nvgFontFaceId(vg, ctx->fontStash->regular);
|
||||
nvgFontSize(vg, style->Dropdown.headerFontSize);
|
||||
nvgTextAlign(vg, NVG_ALIGN_LEFT | NVG_ALIGN_MIDDLE);
|
||||
nvgText(vg, x + style->Dropdown.headerPadding, top + style->Dropdown.headerHeight / 2, this->title.c_str(), nullptr);
|
||||
}
|
||||
|
||||
bool Dropdown::onCancel()
|
||||
{
|
||||
this->valueEvent.fire(-1);
|
||||
Application::popView();
|
||||
return true;
|
||||
}
|
||||
|
||||
unsigned Dropdown::getShowAnimationDuration(ViewAnimation animation)
|
||||
{
|
||||
return View::getShowAnimationDuration(animation) / 2;
|
||||
}
|
||||
|
||||
void Dropdown::layout(NVGcontext* vg, Style* style, FontStash* stash)
|
||||
{
|
||||
// Layout and move the list
|
||||
unsigned listHeight = min(SELECT_VIEW_MAX_ITEMS, this->valuesCount) * style->Dropdown.listItemHeight - (unsigned)this->topOffset;
|
||||
unsigned listWidth = style->Dropdown.listWidth + style->List.marginLeftRight * 2;
|
||||
|
||||
this->list->setBoundaries(
|
||||
this->width / 2 - listWidth / 2,
|
||||
this->height - style->AppletFrame.footerHeight - listHeight - style->Dropdown.listPadding + (unsigned)this->topOffset,
|
||||
listWidth,
|
||||
listHeight);
|
||||
this->list->invalidate(true); // call layout directly to update scrolling
|
||||
|
||||
// Hint
|
||||
// TODO: convert the bottom-left footer into a Label to get its width and avoid clipping with the hint
|
||||
unsigned hintWidth = this->width - style->AppletFrame.separatorSpacing * 2 - style->AppletFrame.footerTextSpacing * 2;
|
||||
|
||||
this->hint->setBoundaries(
|
||||
this->x + this->width - hintWidth - style->AppletFrame.separatorSpacing - style->AppletFrame.footerTextSpacing,
|
||||
this->y + this->height - style->AppletFrame.footerHeight,
|
||||
hintWidth,
|
||||
style->AppletFrame.footerHeight);
|
||||
this->hint->invalidate();
|
||||
}
|
||||
|
||||
View* Dropdown::getDefaultFocus()
|
||||
{
|
||||
return this->list->getDefaultFocus();
|
||||
}
|
||||
|
||||
void Dropdown::open(std::string title, std::vector<std::string> values, ValueSelectedEvent::Callback cb, int selected)
|
||||
{
|
||||
Dropdown* dropdown = new Dropdown(title, values, cb, selected);
|
||||
Application::pushView(dropdown);
|
||||
}
|
||||
|
||||
void Dropdown::willAppear(bool resetState)
|
||||
{
|
||||
if (this->list)
|
||||
this->list->willAppear(resetState);
|
||||
|
||||
if (this->hint)
|
||||
this->hint->willAppear(resetState);
|
||||
}
|
||||
|
||||
void Dropdown::willDisappear(bool resetState)
|
||||
{
|
||||
if (this->list)
|
||||
this->list->willDisappear(resetState);
|
||||
|
||||
if (this->hint)
|
||||
this->hint->willDisappear(resetState);
|
||||
}
|
||||
|
||||
Dropdown::~Dropdown()
|
||||
{
|
||||
delete this->list;
|
||||
delete this->hint;
|
||||
}
|
||||
|
||||
} // namespace brls
|
||||
343
lib/borealis/library/lib/extern/fmt/CMakeLists.txt
vendored
Normal file
343
lib/borealis/library/lib/extern/fmt/CMakeLists.txt
vendored
Normal file
@@ -0,0 +1,343 @@
|
||||
cmake_minimum_required(VERSION 3.1.0)
|
||||
|
||||
# Use newer policies if available, up to most recent tested version of CMake.
|
||||
if(${CMAKE_VERSION} VERSION_LESS 3.11)
|
||||
cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
|
||||
else()
|
||||
cmake_policy(VERSION 3.11)
|
||||
endif()
|
||||
|
||||
# Determine if fmt is built as a subproject (using add_subdirectory)
|
||||
# or if it is the master project.
|
||||
set(MASTER_PROJECT OFF)
|
||||
if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
|
||||
set(MASTER_PROJECT ON)
|
||||
message(STATUS "CMake version: ${CMAKE_VERSION}")
|
||||
endif ()
|
||||
|
||||
# Joins arguments and places the results in ${result_var}.
|
||||
function(join result_var)
|
||||
set(result )
|
||||
foreach (arg ${ARGN})
|
||||
set(result "${result}${arg}")
|
||||
endforeach ()
|
||||
set(${result_var} "${result}" PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
# Sets a cache variable with a docstring joined from multiple arguments:
|
||||
# set(<variable> <value>... CACHE <type> <docstring>...)
|
||||
# This allows splitting a long docstring for readability.
|
||||
function(set_verbose)
|
||||
cmake_parse_arguments(SET_VERBOSE "" "" "CACHE" ${ARGN})
|
||||
list(GET SET_VERBOSE_CACHE 0 type)
|
||||
list(REMOVE_AT SET_VERBOSE_CACHE 0)
|
||||
join(doc ${SET_VERBOSE_CACHE})
|
||||
set(${SET_VERBOSE_UNPARSED_ARGUMENTS} CACHE ${type} ${doc})
|
||||
endfunction()
|
||||
|
||||
# Set the default CMAKE_BUILD_TYPE to Release.
|
||||
# This should be done before the project command since the latter can set
|
||||
# CMAKE_BUILD_TYPE itself (it does so for nmake).
|
||||
if (MASTER_PROJECT AND NOT CMAKE_BUILD_TYPE)
|
||||
set_verbose(CMAKE_BUILD_TYPE Release CACHE STRING
|
||||
"Choose the type of build, options are: None(CMAKE_CXX_FLAGS or "
|
||||
"CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel.")
|
||||
endif ()
|
||||
|
||||
project(FMT CXX)
|
||||
include(GNUInstallDirs)
|
||||
set_verbose(FMT_INC_DIR ${CMAKE_INSTALL_INCLUDEDIR} CACHE STRING
|
||||
"Installation directory for include files, a relative path "
|
||||
"that will be joined to ${CMAKE_INSTALL_PREFIX}, or an arbitrary absolute path.")
|
||||
|
||||
option(FMT_PEDANTIC "Enable extra warnings and expensive tests." OFF)
|
||||
option(FMT_WERROR "Halt the compilation with an error on compiler warnings."
|
||||
OFF)
|
||||
|
||||
# Options that control generation of various targets.
|
||||
option(FMT_DOC "Generate the doc target." ${MASTER_PROJECT})
|
||||
option(FMT_INSTALL "Generate the install target." ${MASTER_PROJECT})
|
||||
option(FMT_TEST "Generate the test target." ${MASTER_PROJECT})
|
||||
option(FMT_FUZZ "Generate the fuzz target." OFF)
|
||||
option(FMT_CUDA_TEST "Generate the cuda-test target." OFF)
|
||||
option(FMT_OS "Include core requiring OS (Windows/Posix) " ON)
|
||||
|
||||
# Get version from core.h
|
||||
file(READ include/fmt/core.h core_h)
|
||||
if (NOT core_h MATCHES "FMT_VERSION ([0-9]+)([0-9][0-9])([0-9][0-9])")
|
||||
message(FATAL_ERROR "Cannot get FMT_VERSION from core.h.")
|
||||
endif ()
|
||||
# Use math to skip leading zeros if any.
|
||||
math(EXPR CPACK_PACKAGE_VERSION_MAJOR ${CMAKE_MATCH_1})
|
||||
math(EXPR CPACK_PACKAGE_VERSION_MINOR ${CMAKE_MATCH_2})
|
||||
math(EXPR CPACK_PACKAGE_VERSION_PATCH ${CMAKE_MATCH_3})
|
||||
join(FMT_VERSION ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.
|
||||
${CPACK_PACKAGE_VERSION_PATCH})
|
||||
message(STATUS "Version: ${FMT_VERSION}")
|
||||
|
||||
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
|
||||
|
||||
if (NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY)
|
||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
||||
endif ()
|
||||
|
||||
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/support/cmake")
|
||||
|
||||
include(cxx14)
|
||||
include(CheckCXXCompilerFlag)
|
||||
include(JoinPaths)
|
||||
|
||||
list(FIND CMAKE_CXX_COMPILE_FEATURES "cxx_variadic_templates" index)
|
||||
if (${index} GREATER -1)
|
||||
# Use cxx_variadic_templates instead of more appropriate cxx_std_11 for
|
||||
# compatibility with older CMake versions.
|
||||
set(FMT_REQUIRED_FEATURES cxx_variadic_templates)
|
||||
endif ()
|
||||
message(STATUS "Required features: ${FMT_REQUIRED_FEATURES}")
|
||||
|
||||
if (CMAKE_CXX_COMPILER_ID MATCHES "GNU")
|
||||
set(PEDANTIC_COMPILE_FLAGS -pedantic-errors -Wall -Wextra -pedantic
|
||||
-Wold-style-cast -Wundef
|
||||
-Wredundant-decls -Wwrite-strings -Wpointer-arith
|
||||
-Wcast-qual -Wformat=2 -Wmissing-include-dirs
|
||||
-Wcast-align
|
||||
-Wctor-dtor-privacy -Wdisabled-optimization
|
||||
-Winvalid-pch -Woverloaded-virtual
|
||||
-Wconversion -Wswitch-enum
|
||||
-Wno-ctor-dtor-privacy -Wno-format-nonliteral -Wno-shadow)
|
||||
if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.6)
|
||||
set(PEDANTIC_COMPILE_FLAGS ${PEDANTIC_COMPILE_FLAGS} -Wnoexcept
|
||||
-Wno-dangling-else -Wno-unused-local-typedefs)
|
||||
endif ()
|
||||
if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0)
|
||||
set(PEDANTIC_COMPILE_FLAGS ${PEDANTIC_COMPILE_FLAGS} -Wdouble-promotion
|
||||
-Wtrampolines -Wzero-as-null-pointer-constant -Wuseless-cast
|
||||
-Wvector-operation-performance -Wsized-deallocation)
|
||||
endif ()
|
||||
if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 6.0)
|
||||
set(PEDANTIC_COMPILE_FLAGS ${PEDANTIC_COMPILE_FLAGS} -Wshift-overflow=2
|
||||
-Wnull-dereference -Wduplicated-cond)
|
||||
endif ()
|
||||
set(WERROR_FLAG -Werror)
|
||||
endif ()
|
||||
|
||||
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||
set(PEDANTIC_COMPILE_FLAGS -Wall -Wextra -pedantic -Wconversion
|
||||
-Wno-sign-conversion -Wdeprecated -Wweak-vtables)
|
||||
check_cxx_compiler_flag(-Wzero-as-null-pointer-constant HAS_NULLPTR_WARNING)
|
||||
if (HAS_NULLPTR_WARNING)
|
||||
set(PEDANTIC_COMPILE_FLAGS ${PEDANTIC_COMPILE_FLAGS}
|
||||
-Wzero-as-null-pointer-constant)
|
||||
endif ()
|
||||
set(WERROR_FLAG -Werror)
|
||||
endif ()
|
||||
|
||||
if (MSVC)
|
||||
set(PEDANTIC_COMPILE_FLAGS /W3)
|
||||
set(WERROR_FLAG /WX)
|
||||
endif ()
|
||||
|
||||
if (MASTER_PROJECT AND CMAKE_GENERATOR MATCHES "Visual Studio")
|
||||
# If Microsoft SDK is installed create script run-msbuild.bat that
|
||||
# calls SetEnv.cmd to set up build environment and runs msbuild.
|
||||
# It is useful when building Visual Studio projects with the SDK
|
||||
# toolchain rather than Visual Studio.
|
||||
include(FindSetEnv)
|
||||
if (WINSDK_SETENV)
|
||||
set(MSBUILD_SETUP "call \"${WINSDK_SETENV}\"")
|
||||
endif ()
|
||||
# Set FrameworkPathOverride to get rid of MSB3644 warnings.
|
||||
join(netfxpath
|
||||
"C:\\Program Files\\Reference Assemblies\\Microsoft\\Framework\\"
|
||||
".NETFramework\\v4.0")
|
||||
file(WRITE run-msbuild.bat "
|
||||
${MSBUILD_SETUP}
|
||||
${CMAKE_MAKE_PROGRAM} -p:FrameworkPathOverride=\"${netfxpath}\" %*")
|
||||
endif ()
|
||||
|
||||
set(strtod_l_headers stdlib.h)
|
||||
if (APPLE)
|
||||
set(strtod_l_headers ${strtod_l_headers} xlocale.h)
|
||||
endif ()
|
||||
|
||||
include(CheckSymbolExists)
|
||||
if (WIN32)
|
||||
check_symbol_exists(_strtod_l "${strtod_l_headers}" HAVE_STRTOD_L)
|
||||
else ()
|
||||
check_symbol_exists(strtod_l "${strtod_l_headers}" HAVE_STRTOD_L)
|
||||
endif ()
|
||||
|
||||
function(add_headers VAR)
|
||||
set(headers ${${VAR}})
|
||||
foreach (header ${ARGN})
|
||||
set(headers ${headers} include/fmt/${header})
|
||||
endforeach()
|
||||
set(${VAR} ${headers} PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
# Define the fmt library, its includes and the needed defines.
|
||||
add_headers(FMT_HEADERS chrono.h color.h compile.h core.h format.h format-inl.h
|
||||
locale.h os.h ostream.h posix.h printf.h ranges.h)
|
||||
if (FMT_OS)
|
||||
set(FMT_SOURCES src/format.cc src/os.cc)
|
||||
else()
|
||||
set(FMT_SOURCES src/format.cc)
|
||||
endif ()
|
||||
|
||||
add_library(fmt ${FMT_SOURCES} ${FMT_HEADERS} README.rst ChangeLog.rst)
|
||||
add_library(fmt::fmt ALIAS fmt)
|
||||
|
||||
if (HAVE_STRTOD_L)
|
||||
target_compile_definitions(fmt PUBLIC FMT_LOCALE)
|
||||
endif ()
|
||||
|
||||
if (MINGW)
|
||||
target_compile_options(fmt PUBLIC "-Wa,-mbig-obj")
|
||||
endif ()
|
||||
|
||||
if (FMT_WERROR)
|
||||
target_compile_options(fmt PRIVATE ${WERROR_FLAG})
|
||||
endif ()
|
||||
if (FMT_PEDANTIC)
|
||||
target_compile_options(fmt PRIVATE ${PEDANTIC_COMPILE_FLAGS})
|
||||
endif ()
|
||||
|
||||
target_compile_features(fmt INTERFACE ${FMT_REQUIRED_FEATURES})
|
||||
|
||||
target_include_directories(fmt PUBLIC
|
||||
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
|
||||
$<INSTALL_INTERFACE:${FMT_INC_DIR}>)
|
||||
|
||||
set(FMT_DEBUG_POSTFIX d CACHE STRING "Debug library postfix.")
|
||||
|
||||
set_target_properties(fmt PROPERTIES
|
||||
VERSION ${FMT_VERSION} SOVERSION ${CPACK_PACKAGE_VERSION_MAJOR}
|
||||
DEBUG_POSTFIX "${FMT_DEBUG_POSTFIX}")
|
||||
|
||||
# Set FMT_LIB_NAME for pkg-config fmt.pc. We cannot use the OUTPUT_NAME target
|
||||
# property because it's not set by default.
|
||||
set(FMT_LIB_NAME fmt)
|
||||
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
set(FMT_LIB_NAME ${FMT_LIB_NAME}${FMT_DEBUG_POSTFIX})
|
||||
endif ()
|
||||
|
||||
if (BUILD_SHARED_LIBS)
|
||||
if (UNIX AND NOT APPLE AND NOT ${CMAKE_SYSTEM_NAME} MATCHES "SunOS" AND NOT EMSCRIPTEN)
|
||||
# Fix rpmlint warning:
|
||||
# unused-direct-shlib-dependency /usr/lib/libformat.so.1.1.0 /lib/libm.so.6.
|
||||
target_link_libraries(fmt -Wl,--as-needed)
|
||||
endif ()
|
||||
target_compile_definitions(fmt PRIVATE FMT_EXPORT INTERFACE FMT_SHARED)
|
||||
endif ()
|
||||
if (FMT_SAFE_DURATION_CAST)
|
||||
target_compile_definitions(fmt PUBLIC FMT_SAFE_DURATION_CAST)
|
||||
endif()
|
||||
|
||||
add_library(fmt-header-only INTERFACE)
|
||||
add_library(fmt::fmt-header-only ALIAS fmt-header-only)
|
||||
|
||||
target_compile_definitions(fmt-header-only INTERFACE FMT_HEADER_ONLY=1)
|
||||
target_compile_features(fmt-header-only INTERFACE ${FMT_REQUIRED_FEATURES})
|
||||
|
||||
target_include_directories(fmt-header-only INTERFACE
|
||||
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
|
||||
$<INSTALL_INTERFACE:${FMT_INC_DIR}>)
|
||||
|
||||
# Install targets.
|
||||
if (FMT_INSTALL)
|
||||
include(CMakePackageConfigHelpers)
|
||||
set_verbose(FMT_CMAKE_DIR ${CMAKE_INSTALL_LIBDIR}/cmake/fmt CACHE STRING
|
||||
"Installation directory for cmake files, a relative path "
|
||||
"that will be joined to ${CMAKE_INSTALL_PREFIX}, or an arbitrary absolute path.")
|
||||
set(version_config ${PROJECT_BINARY_DIR}/fmt-config-version.cmake)
|
||||
set(project_config ${PROJECT_BINARY_DIR}/fmt-config.cmake)
|
||||
set(pkgconfig ${PROJECT_BINARY_DIR}/fmt.pc)
|
||||
set(targets_export_name fmt-targets)
|
||||
|
||||
set_verbose(FMT_LIB_DIR ${CMAKE_INSTALL_LIBDIR} CACHE STRING
|
||||
"Installation directory for libraries, a relative path "
|
||||
"that will be joined to ${CMAKE_INSTALL_PREFIX}, or an arbitrary absolute path.")
|
||||
|
||||
set_verbose(FMT_PKGCONFIG_DIR ${CMAKE_INSTALL_LIBDIR}/pkgconfig CACHE PATH
|
||||
"Installation directory for pkgconfig (.pc) files, a relative path "
|
||||
"that will be joined to ${CMAKE_INSTALL_PREFIX}, or an arbitrary absolute path.")
|
||||
|
||||
# Generate the version, config and target files into the build directory.
|
||||
write_basic_package_version_file(
|
||||
${version_config}
|
||||
VERSION ${FMT_VERSION}
|
||||
COMPATIBILITY AnyNewerVersion)
|
||||
|
||||
join_paths(libdir_for_pc_file "\${exec_prefix}" "${FMT_LIB_DIR}")
|
||||
join_paths(includedir_for_pc_file "\${prefix}" "${FMT_INC_DIR}")
|
||||
|
||||
configure_file(
|
||||
"${PROJECT_SOURCE_DIR}/support/cmake/fmt.pc.in"
|
||||
"${pkgconfig}"
|
||||
@ONLY)
|
||||
configure_package_config_file(
|
||||
${PROJECT_SOURCE_DIR}/support/cmake/fmt-config.cmake.in
|
||||
${project_config}
|
||||
INSTALL_DESTINATION ${FMT_CMAKE_DIR})
|
||||
|
||||
set(INSTALL_TARGETS fmt fmt-header-only)
|
||||
# Use a namespace because CMake provides better diagnostics for namespaced
|
||||
# imported targets.
|
||||
export(TARGETS ${INSTALL_TARGETS} NAMESPACE fmt::
|
||||
FILE ${PROJECT_BINARY_DIR}/${targets_export_name}.cmake)
|
||||
|
||||
# Install version, config and target files.
|
||||
install(
|
||||
FILES ${project_config} ${version_config}
|
||||
DESTINATION ${FMT_CMAKE_DIR})
|
||||
install(EXPORT ${targets_export_name} DESTINATION ${FMT_CMAKE_DIR}
|
||||
NAMESPACE fmt::)
|
||||
|
||||
# Install the library and headers.
|
||||
install(TARGETS ${INSTALL_TARGETS} EXPORT ${targets_export_name}
|
||||
LIBRARY DESTINATION ${FMT_LIB_DIR}
|
||||
ARCHIVE DESTINATION ${FMT_LIB_DIR}
|
||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
||||
|
||||
install(FILES $<TARGET_PDB_FILE:${INSTALL_TARGETS}>
|
||||
DESTINATION ${FMT_LIB_DIR} OPTIONAL)
|
||||
install(FILES ${FMT_HEADERS} DESTINATION "${FMT_INC_DIR}/fmt")
|
||||
install(FILES "${pkgconfig}" DESTINATION "${FMT_PKGCONFIG_DIR}")
|
||||
endif ()
|
||||
|
||||
if (FMT_DOC)
|
||||
add_subdirectory(doc)
|
||||
endif ()
|
||||
|
||||
if (FMT_TEST)
|
||||
enable_testing()
|
||||
add_subdirectory(test)
|
||||
endif ()
|
||||
|
||||
# Control fuzzing independent of the unit tests.
|
||||
if (FMT_FUZZ)
|
||||
add_subdirectory(test/fuzzing)
|
||||
target_compile_definitions(fmt PUBLIC FMT_FUZZ)
|
||||
endif ()
|
||||
|
||||
set(gitignore ${PROJECT_SOURCE_DIR}/.gitignore)
|
||||
if (MASTER_PROJECT AND EXISTS ${gitignore})
|
||||
# Get the list of ignored files from .gitignore.
|
||||
file (STRINGS ${gitignore} lines)
|
||||
list(REMOVE_ITEM lines /doc/html)
|
||||
foreach (line ${lines})
|
||||
string(REPLACE "." "[.]" line "${line}")
|
||||
string(REPLACE "*" ".*" line "${line}")
|
||||
set(ignored_files ${ignored_files} "${line}$" "${line}/")
|
||||
endforeach ()
|
||||
set(ignored_files ${ignored_files}
|
||||
/.git /breathe /format-benchmark sphinx/ .buildinfo .doctrees)
|
||||
|
||||
set(CPACK_SOURCE_GENERATOR ZIP)
|
||||
set(CPACK_SOURCE_IGNORE_FILES ${ignored_files})
|
||||
set(CPACK_SOURCE_PACKAGE_FILE_NAME fmt-${FMT_VERSION})
|
||||
set(CPACK_PACKAGE_NAME fmt)
|
||||
set(CPACK_RESOURCE_FILE_README ${PROJECT_SOURCE_DIR}/README.rst)
|
||||
include(CPack)
|
||||
endif ()
|
||||
17
lib/borealis/library/lib/extern/fmt/CONTRIBUTING.md
vendored
Normal file
17
lib/borealis/library/lib/extern/fmt/CONTRIBUTING.md
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
Contributing to {fmt}
|
||||
=====================
|
||||
|
||||
By submitting a pull request or a patch, you represent that you have the right
|
||||
to license your contribution to the {fmt} project owners and the community,
|
||||
agree that your contributions are licensed under the {fmt} license, and agree
|
||||
to future changes to the licensing.
|
||||
|
||||
All C++ code must adhere to [Google C++ Style Guide](
|
||||
https://google.github.io/styleguide/cppguide.html) with the following
|
||||
exceptions:
|
||||
|
||||
* Exceptions are permitted
|
||||
* snake_case should be used instead of UpperCamelCase for function and type
|
||||
names
|
||||
|
||||
Thanks for contributing!
|
||||
3211
lib/borealis/library/lib/extern/fmt/ChangeLog.rst
vendored
Normal file
3211
lib/borealis/library/lib/extern/fmt/ChangeLog.rst
vendored
Normal file
File diff suppressed because it is too large
Load Diff
27
lib/borealis/library/lib/extern/fmt/LICENSE.rst
vendored
Normal file
27
lib/borealis/library/lib/extern/fmt/LICENSE.rst
vendored
Normal file
@@ -0,0 +1,27 @@
|
||||
Copyright (c) 2012 - present, Victor Zverovich
|
||||
|
||||
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.
|
||||
|
||||
--- Optional exception to the license ---
|
||||
|
||||
As an exception, if, as a result of your compiling your source code, portions
|
||||
of this Software are embedded into a machine-executable object form of such
|
||||
source code, you may redistribute such embedded portions in such object form
|
||||
without including the above copyright and permission notices.
|
||||
479
lib/borealis/library/lib/extern/fmt/README.rst
vendored
Normal file
479
lib/borealis/library/lib/extern/fmt/README.rst
vendored
Normal file
@@ -0,0 +1,479 @@
|
||||
{fmt}
|
||||
=====
|
||||
|
||||
.. image:: https://travis-ci.org/fmtlib/fmt.png?branch=master
|
||||
:target: https://travis-ci.org/fmtlib/fmt
|
||||
|
||||
.. image:: https://ci.appveyor.com/api/projects/status/ehjkiefde6gucy1v
|
||||
:target: https://ci.appveyor.com/project/vitaut/fmt
|
||||
|
||||
.. image:: https://oss-fuzz-build-logs.storage.googleapis.com/badges/libfmt.svg
|
||||
:alt: fmt is continuously fuzzed at oss-fuzz
|
||||
:target: https://bugs.chromium.org/p/oss-fuzz/issues/list?\
|
||||
colspec=ID%20Type%20Component%20Status%20Proj%20Reported%20Owner%20\
|
||||
Summary&q=proj%3Dlibfmt&can=1
|
||||
|
||||
.. image:: https://img.shields.io/badge/stackoverflow-fmt-blue.svg
|
||||
:alt: Ask questions at StackOverflow with the tag fmt
|
||||
:target: https://stackoverflow.com/questions/tagged/fmt
|
||||
|
||||
**{fmt}** is an open-source formatting library for C++.
|
||||
It can be used as a safe and fast alternative to (s)printf and iostreams.
|
||||
|
||||
`Documentation <https://fmt.dev>`__
|
||||
|
||||
Q&A: ask questions on `StackOverflow with the tag fmt
|
||||
<https://stackoverflow.com/questions/tagged/fmt>`_.
|
||||
|
||||
Features
|
||||
--------
|
||||
|
||||
* Simple `format API <https://fmt.dev/dev/api.html>`_ with positional arguments
|
||||
for localization
|
||||
* Implementation of `C++20 std::format
|
||||
<https://en.cppreference.com/w/cpp/utility/format>`__
|
||||
* `Format string syntax <https://fmt.dev/dev/syntax.html>`_ similar to Python's
|
||||
`format <https://docs.python.org/3/library/stdtypes.html#str.format>`_
|
||||
* Safe `printf implementation
|
||||
<https://fmt.dev/latest/api.html#printf-formatting>`_ including the POSIX
|
||||
extension for positional arguments
|
||||
* Extensibility: `support for user-defined types
|
||||
<https://fmt.dev/latest/api.html#formatting-user-defined-types>`_
|
||||
* High performance: faster than common standard library implementations of
|
||||
``(s)printf``, iostreams, ``to_string`` and ``to_chars``, see `Speed tests`_
|
||||
and `Converting a hundred million integers to strings per second
|
||||
<http://www.zverovich.net/2020/06/13/fast-int-to-string-revisited.html>`_
|
||||
* Small code size both in terms of source code with the minimum configuration
|
||||
consisting of just three files, ``core.h``, ``format.h`` and ``format-inl.h``,
|
||||
and compiled code; see `Compile time and code bloat`_
|
||||
* Reliability: the library has an extensive set of `unit tests
|
||||
<https://github.com/fmtlib/fmt/tree/master/test>`_ and is continuously fuzzed
|
||||
* Safety: the library is fully type safe, errors in format strings can be
|
||||
reported at compile time, automatic memory management prevents buffer overflow
|
||||
errors
|
||||
* Ease of use: small self-contained code base, no external dependencies,
|
||||
permissive MIT `license
|
||||
<https://github.com/fmtlib/fmt/blob/master/LICENSE.rst>`_
|
||||
* `Portability <https://fmt.dev/latest/index.html#portability>`_ with
|
||||
consistent output across platforms and support for older compilers
|
||||
* Clean warning-free codebase even on high warning levels such as
|
||||
``-Wall -Wextra -pedantic``
|
||||
* Locale-independence by default
|
||||
* Optional header-only configuration enabled with the ``FMT_HEADER_ONLY`` macro
|
||||
|
||||
See the `documentation <https://fmt.dev>`_ for more details.
|
||||
|
||||
Examples
|
||||
--------
|
||||
|
||||
Print ``Hello, world!`` to ``stdout``:
|
||||
|
||||
.. code:: c++
|
||||
|
||||
#include <fmt/core.h>
|
||||
|
||||
int main() {
|
||||
fmt::print("Hello, world!\n");
|
||||
}
|
||||
|
||||
Format a string:
|
||||
|
||||
.. code:: c++
|
||||
|
||||
std::string s = fmt::format("The answer is {}.", 42);
|
||||
// s == "The answer is 42."
|
||||
|
||||
Format a string using positional arguments:
|
||||
|
||||
.. code:: c++
|
||||
|
||||
std::string s = fmt::format("I'd rather be {1} than {0}.", "right", "happy");
|
||||
// s == "I'd rather be happy than right."
|
||||
|
||||
Print chrono durations:
|
||||
|
||||
.. code:: c++
|
||||
|
||||
#include <fmt/chrono.h>
|
||||
|
||||
int main() {
|
||||
using namespace std::literals::chrono_literals;
|
||||
fmt::print("Default format: {} {}\n", 42s, 100ms);
|
||||
fmt::print("strftime-like format: {:%H:%M:%S}\n", 3h + 15min + 30s);
|
||||
}
|
||||
|
||||
Output::
|
||||
|
||||
Default format: 42s 100ms
|
||||
strftime-like format: 03:15:30
|
||||
|
||||
Print a container:
|
||||
|
||||
.. code:: c++
|
||||
|
||||
#include <vector>
|
||||
#include <fmt/ranges.h>
|
||||
|
||||
int main() {
|
||||
std::vector<int> v = {1, 2, 3};
|
||||
fmt::print("{}\n", v);
|
||||
}
|
||||
|
||||
Output::
|
||||
|
||||
{1, 2, 3}
|
||||
|
||||
Check a format string at compile time:
|
||||
|
||||
.. code:: c++
|
||||
|
||||
std::string s = fmt::format(FMT_STRING("{:d}"), "don't panic");
|
||||
|
||||
This gives a compile-time error because ``d`` is an invalid format specifier for
|
||||
a string.
|
||||
|
||||
Create your own functions similar to `format
|
||||
<https://fmt.dev/latest/api.html#format>`_ and
|
||||
`print <https://fmt.dev/latest/api.html#print>`_
|
||||
which take arbitrary arguments (`godbolt <https://godbolt.org/g/MHjHVf>`_):
|
||||
|
||||
.. code:: c++
|
||||
|
||||
// Prints formatted error message.
|
||||
void vreport_error(const char* format, fmt::format_args args) {
|
||||
fmt::print("Error: ");
|
||||
fmt::vprint(format, args);
|
||||
}
|
||||
template <typename... Args>
|
||||
void report_error(const char* format, const Args & ... args) {
|
||||
vreport_error(format, fmt::make_format_args(args...));
|
||||
}
|
||||
|
||||
report_error("file not found: {}", path);
|
||||
|
||||
Note that ``vreport_error`` is not parameterized on argument types which can
|
||||
improve compile times and reduce code size compared to a fully parameterized
|
||||
version.
|
||||
|
||||
Benchmarks
|
||||
----------
|
||||
|
||||
Speed tests
|
||||
~~~~~~~~~~~
|
||||
|
||||
================= ============= ===========
|
||||
Library Method Run Time, s
|
||||
================= ============= ===========
|
||||
libc printf 1.04
|
||||
libc++ std::ostream 3.05
|
||||
{fmt} 6.1.1 fmt::print 0.75
|
||||
Boost Format 1.67 boost::format 7.24
|
||||
Folly Format folly::format 2.23
|
||||
================= ============= ===========
|
||||
|
||||
{fmt} is the fastest of the benchmarked methods, ~35% faster than ``printf``.
|
||||
|
||||
The above results were generated by building ``tinyformat_test.cpp`` on macOS
|
||||
10.14.6 with ``clang++ -O3 -DNDEBUG -DSPEED_TEST -DHAVE_FORMAT``, and taking the
|
||||
best of three runs. In the test, the format string ``"%0.10f:%04d:%+g:%s:%p:%c:%%\n"``
|
||||
or equivalent is filled 2,000,000 times with output sent to ``/dev/null``; for
|
||||
further details refer to the `source
|
||||
<https://github.com/fmtlib/format-benchmark/blob/master/tinyformat_test.cpp>`_.
|
||||
|
||||
{fmt} is up to 10x faster than ``std::ostringstream`` and ``sprintf`` on
|
||||
floating-point formatting (`dtoa-benchmark <https://github.com/fmtlib/dtoa-benchmark>`_)
|
||||
and faster than `double-conversion <https://github.com/google/double-conversion>`_:
|
||||
|
||||
.. image:: https://user-images.githubusercontent.com/576385/
|
||||
69767160-cdaca400-112f-11ea-9fc5-347c9f83caad.png
|
||||
:target: https://fmt.dev/unknown_mac64_clang10.0.html
|
||||
|
||||
Compile time and code bloat
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The script `bloat-test.py
|
||||
<https://github.com/fmtlib/format-benchmark/blob/master/bloat-test.py>`_
|
||||
from `format-benchmark <https://github.com/fmtlib/format-benchmark>`_
|
||||
tests compile time and code bloat for nontrivial projects.
|
||||
It generates 100 translation units and uses ``printf()`` or its alternative
|
||||
five times in each to simulate a medium sized project. The resulting
|
||||
executable size and compile time (Apple LLVM version 8.1.0 (clang-802.0.42),
|
||||
macOS Sierra, best of three) is shown in the following tables.
|
||||
|
||||
**Optimized build (-O3)**
|
||||
|
||||
============= =============== ==================== ==================
|
||||
Method Compile Time, s Executable size, KiB Stripped size, KiB
|
||||
============= =============== ==================== ==================
|
||||
printf 2.6 29 26
|
||||
printf+string 16.4 29 26
|
||||
iostreams 31.1 59 55
|
||||
{fmt} 19.0 37 34
|
||||
Boost Format 91.9 226 203
|
||||
Folly Format 115.7 101 88
|
||||
============= =============== ==================== ==================
|
||||
|
||||
As you can see, {fmt} has 60% less overhead in terms of resulting binary code
|
||||
size compared to iostreams and comes pretty close to ``printf``. Boost Format
|
||||
and Folly Format have the largest overheads.
|
||||
|
||||
``printf+string`` is the same as ``printf`` but with extra ``<string>``
|
||||
include to measure the overhead of the latter.
|
||||
|
||||
**Non-optimized build**
|
||||
|
||||
============= =============== ==================== ==================
|
||||
Method Compile Time, s Executable size, KiB Stripped size, KiB
|
||||
============= =============== ==================== ==================
|
||||
printf 2.2 33 30
|
||||
printf+string 16.0 33 30
|
||||
iostreams 28.3 56 52
|
||||
{fmt} 18.2 59 50
|
||||
Boost Format 54.1 365 303
|
||||
Folly Format 79.9 445 430
|
||||
============= =============== ==================== ==================
|
||||
|
||||
``libc``, ``lib(std)c++`` and ``libfmt`` are all linked as shared libraries to
|
||||
compare formatting function overhead only. Boost Format is a
|
||||
header-only library so it doesn't provide any linkage options.
|
||||
|
||||
Running the tests
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
Please refer to `Building the library`__ for the instructions on how to build
|
||||
the library and run the unit tests.
|
||||
|
||||
__ https://fmt.dev/latest/usage.html#building-the-library
|
||||
|
||||
Benchmarks reside in a separate repository,
|
||||
`format-benchmarks <https://github.com/fmtlib/format-benchmark>`_,
|
||||
so to run the benchmarks you first need to clone this repository and
|
||||
generate Makefiles with CMake::
|
||||
|
||||
$ git clone --recursive https://github.com/fmtlib/format-benchmark.git
|
||||
$ cd format-benchmark
|
||||
$ cmake .
|
||||
|
||||
Then you can run the speed test::
|
||||
|
||||
$ make speed-test
|
||||
|
||||
or the bloat test::
|
||||
|
||||
$ make bloat-test
|
||||
|
||||
Projects using this library
|
||||
---------------------------
|
||||
|
||||
* `0 A.D. <https://play0ad.com/>`_: A free, open-source, cross-platform
|
||||
real-time strategy game
|
||||
|
||||
* `AMPL/MP <https://github.com/ampl/mp>`_:
|
||||
An open-source library for mathematical programming
|
||||
|
||||
* `Aseprite <https://github.com/aseprite/aseprite>`_:
|
||||
Animated sprite editor & pixel art tool
|
||||
|
||||
* `AvioBook <https://www.aviobook.aero/en>`_: A comprehensive aircraft
|
||||
operations suite
|
||||
|
||||
* `Celestia <https://celestia.space/>`_: Real-time 3D visualization of space
|
||||
|
||||
* `Ceph <https://ceph.com/>`_: A scalable distributed storage system
|
||||
|
||||
* `ccache <https://ccache.dev/>`_: A compiler cache
|
||||
|
||||
* `ClickHouse <https://github.com/ClickHouse/ClickHouse>`_: analytical database
|
||||
management system
|
||||
|
||||
* `CUAUV <http://cuauv.org/>`_: Cornell University's autonomous underwater
|
||||
vehicle
|
||||
|
||||
* `Drake <https://drake.mit.edu/>`_: A planning, control, and analysis toolbox
|
||||
for nonlinear dynamical systems (MIT)
|
||||
|
||||
* `Envoy <https://lyft.github.io/envoy/>`_: C++ L7 proxy and communication bus
|
||||
(Lyft)
|
||||
|
||||
* `FiveM <https://fivem.net/>`_: a modification framework for GTA V
|
||||
|
||||
* `Folly <https://github.com/facebook/folly>`_: Facebook open-source library
|
||||
|
||||
* `HarpyWar/pvpgn <https://github.com/pvpgn/pvpgn-server>`_:
|
||||
Player vs Player Gaming Network with tweaks
|
||||
|
||||
* `KBEngine <https://github.com/kbengine/kbengine>`_: An open-source MMOG server
|
||||
engine
|
||||
|
||||
* `Keypirinha <https://keypirinha.com/>`_: A semantic launcher for Windows
|
||||
|
||||
* `Kodi <https://kodi.tv/>`_ (formerly xbmc): Home theater software
|
||||
|
||||
* `Knuth <https://kth.cash/>`_: High-performance Bitcoin full-node
|
||||
|
||||
* `Microsoft Verona <https://github.com/microsoft/verona>`_:
|
||||
Research programming language for concurrent ownership
|
||||
|
||||
* `MongoDB <https://mongodb.com/>`_: Distributed document database
|
||||
|
||||
* `MongoDB Smasher <https://github.com/duckie/mongo_smasher>`_: A small tool to
|
||||
generate randomized datasets
|
||||
|
||||
* `OpenSpace <https://openspaceproject.com/>`_: An open-source
|
||||
astrovisualization framework
|
||||
|
||||
* `PenUltima Online (POL) <https://www.polserver.com/>`_:
|
||||
An MMO server, compatible with most Ultima Online clients
|
||||
|
||||
* `PyTorch <https://github.com/pytorch/pytorch>`_: An open-source machine
|
||||
learning library
|
||||
|
||||
* `quasardb <https://www.quasardb.net/>`_: A distributed, high-performance,
|
||||
associative database
|
||||
|
||||
* `readpe <https://bitbucket.org/sys_dev/readpe>`_: Read Portable Executable
|
||||
|
||||
* `redis-cerberus <https://github.com/HunanTV/redis-cerberus>`_: A Redis cluster
|
||||
proxy
|
||||
|
||||
* `redpanda <https://vectorized.io/redpanda>`_: A 10x faster Kafka® replacement
|
||||
for mission critical systems written in C++
|
||||
|
||||
* `rpclib <http://rpclib.net/>`_: A modern C++ msgpack-RPC server and client
|
||||
library
|
||||
|
||||
* `Salesforce Analytics Cloud
|
||||
<https://www.salesforce.com/analytics-cloud/overview/>`_:
|
||||
Business intelligence software
|
||||
|
||||
* `Scylla <https://www.scylladb.com/>`_: A Cassandra-compatible NoSQL data store
|
||||
that can handle 1 million transactions per second on a single server
|
||||
|
||||
* `Seastar <http://www.seastar-project.org/>`_: An advanced, open-source C++
|
||||
framework for high-performance server applications on modern hardware
|
||||
|
||||
* `spdlog <https://github.com/gabime/spdlog>`_: Super fast C++ logging library
|
||||
|
||||
* `Stellar <https://www.stellar.org/>`_: Financial platform
|
||||
|
||||
* `Touch Surgery <https://www.touchsurgery.com/>`_: Surgery simulator
|
||||
|
||||
* `TrinityCore <https://github.com/TrinityCore/TrinityCore>`_: Open-source
|
||||
MMORPG framework
|
||||
|
||||
* `Windows Terminal <https://github.com/microsoft/terminal>`_: The new Windows
|
||||
Terminal
|
||||
|
||||
`More... <https://github.com/search?q=fmtlib&type=Code>`_
|
||||
|
||||
If you are aware of other projects using this library, please let me know
|
||||
by `email <mailto:victor.zverovich@gmail.com>`_ or by submitting an
|
||||
`issue <https://github.com/fmtlib/fmt/issues>`_.
|
||||
|
||||
Motivation
|
||||
----------
|
||||
|
||||
So why yet another formatting library?
|
||||
|
||||
There are plenty of methods for doing this task, from standard ones like
|
||||
the printf family of function and iostreams to Boost Format and FastFormat
|
||||
libraries. The reason for creating a new library is that every existing
|
||||
solution that I found either had serious issues or didn't provide
|
||||
all the features I needed.
|
||||
|
||||
printf
|
||||
~~~~~~
|
||||
|
||||
The good thing about ``printf`` is that it is pretty fast and readily available
|
||||
being a part of the C standard library. The main drawback is that it
|
||||
doesn't support user-defined types. ``printf`` also has safety issues although
|
||||
they are somewhat mitigated with `__attribute__ ((format (printf, ...))
|
||||
<https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html>`_ in GCC.
|
||||
There is a POSIX extension that adds positional arguments required for
|
||||
`i18n <https://en.wikipedia.org/wiki/Internationalization_and_localization>`_
|
||||
to ``printf`` but it is not a part of C99 and may not be available on some
|
||||
platforms.
|
||||
|
||||
iostreams
|
||||
~~~~~~~~~
|
||||
|
||||
The main issue with iostreams is best illustrated with an example:
|
||||
|
||||
.. code:: c++
|
||||
|
||||
std::cout << std::setprecision(2) << std::fixed << 1.23456 << "\n";
|
||||
|
||||
which is a lot of typing compared to printf:
|
||||
|
||||
.. code:: c++
|
||||
|
||||
printf("%.2f\n", 1.23456);
|
||||
|
||||
Matthew Wilson, the author of FastFormat, called this "chevron hell". iostreams
|
||||
don't support positional arguments by design.
|
||||
|
||||
The good part is that iostreams support user-defined types and are safe although
|
||||
error handling is awkward.
|
||||
|
||||
Boost Format
|
||||
~~~~~~~~~~~~
|
||||
|
||||
This is a very powerful library which supports both ``printf``-like format
|
||||
strings and positional arguments. Its main drawback is performance. According to
|
||||
various, benchmarks it is much slower than other methods considered here. Boost
|
||||
Format also has excessive build times and severe code bloat issues (see
|
||||
`Benchmarks`_).
|
||||
|
||||
FastFormat
|
||||
~~~~~~~~~~
|
||||
|
||||
This is an interesting library which is fast, safe and has positional arguments.
|
||||
However, it has significant limitations, citing its author:
|
||||
|
||||
Three features that have no hope of being accommodated within the
|
||||
current design are:
|
||||
|
||||
* Leading zeros (or any other non-space padding)
|
||||
* Octal/hexadecimal encoding
|
||||
* Runtime width/alignment specification
|
||||
|
||||
It is also quite big and has a heavy dependency, STLSoft, which might be too
|
||||
restrictive for using it in some projects.
|
||||
|
||||
Boost Spirit.Karma
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
This is not really a formatting library but I decided to include it here for
|
||||
completeness. As iostreams, it suffers from the problem of mixing verbatim text
|
||||
with arguments. The library is pretty fast, but slower on integer formatting
|
||||
than ``fmt::format_to`` with format string compilation on Karma's own benchmark,
|
||||
see `Converting a hundred million integers to strings per second
|
||||
<http://www.zverovich.net/2020/06/13/fast-int-to-string-revisited.html>`_.
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
{fmt} is distributed under the MIT `license
|
||||
<https://github.com/fmtlib/fmt/blob/master/LICENSE.rst>`_.
|
||||
|
||||
Documentation License
|
||||
---------------------
|
||||
|
||||
The `Format String Syntax <https://fmt.dev/latest/syntax.html>`_
|
||||
section in the documentation is based on the one from Python `string module
|
||||
documentation <https://docs.python.org/3/library/string.html#module-string>`_.
|
||||
For this reason the documentation is distributed under the Python Software
|
||||
Foundation license available in `doc/python-license.txt
|
||||
<https://raw.github.com/fmtlib/fmt/master/doc/python-license.txt>`_.
|
||||
It only applies if you distribute the documentation of {fmt}.
|
||||
|
||||
Maintainers
|
||||
-----------
|
||||
|
||||
The {fmt} library is maintained by Victor Zverovich (`vitaut
|
||||
<https://github.com/vitaut>`_) and Jonathan Müller (`foonathan
|
||||
<https://github.com/foonathan>`_) with contributions from many other people.
|
||||
See `Contributors <https://github.com/fmtlib/fmt/graphs/contributors>`_ and
|
||||
`Releases <https://github.com/fmtlib/fmt/releases>`_ for some of the names.
|
||||
Let us know if your contribution is not listed or mentioned incorrectly and
|
||||
we'll make it right.
|
||||
18
lib/borealis/library/lib/extern/fmt/doc/CMakeLists.txt
vendored
Normal file
18
lib/borealis/library/lib/extern/fmt/doc/CMakeLists.txt
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
find_program(DOXYGEN doxygen)
|
||||
if (NOT DOXYGEN)
|
||||
message(STATUS "Target 'doc' disabled (requires doxygen)")
|
||||
return ()
|
||||
endif ()
|
||||
|
||||
find_package(PythonInterp QUIET REQUIRED)
|
||||
find_program(SPHINX_EXECUTABLE NAMES sphinx-build sphinx-build-3)
|
||||
|
||||
add_custom_target(doc
|
||||
COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/build.py
|
||||
${SPHINX_EXECUTABLE} ${FMT_VERSION}
|
||||
SOURCES api.rst syntax.rst usage.rst build.py conf.py _templates/layout.html)
|
||||
|
||||
include(GNUInstallDirs)
|
||||
install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html/
|
||||
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/doc/fmt OPTIONAL
|
||||
PATTERN ".doctrees" EXCLUDE)
|
||||
7
lib/borealis/library/lib/extern/fmt/doc/_static/bootstrap.min.js
vendored
Normal file
7
lib/borealis/library/lib/extern/fmt/doc/_static/bootstrap.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
28
lib/borealis/library/lib/extern/fmt/doc/_static/breathe.css
vendored
Normal file
28
lib/borealis/library/lib/extern/fmt/doc/_static/breathe.css
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
|
||||
/* -- breathe specific styles ----------------------------------------------- */
|
||||
|
||||
/* So enum value descriptions are displayed inline to the item */
|
||||
.breatheenumvalues li tt + p {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
/* So parameter descriptions are displayed inline to the item */
|
||||
.breatheparameterlist li tt + p {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
.container .breathe-sectiondef {
|
||||
width: inherit;
|
||||
}
|
||||
|
||||
.github-btn {
|
||||
border: 0;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.jumbotron {
|
||||
background-size: 100% 4px;
|
||||
background-repeat: repeat-y;
|
||||
color: white;
|
||||
text-align: center;
|
||||
}
|
||||
BIN
lib/borealis/library/lib/extern/fmt/doc/_static/fonts/glyphicons-halflings-regular.eot
vendored
Normal file
BIN
lib/borealis/library/lib/extern/fmt/doc/_static/fonts/glyphicons-halflings-regular.eot
vendored
Normal file
Binary file not shown.
229
lib/borealis/library/lib/extern/fmt/doc/_static/fonts/glyphicons-halflings-regular.svg
vendored
Normal file
229
lib/borealis/library/lib/extern/fmt/doc/_static/fonts/glyphicons-halflings-regular.svg
vendored
Normal file
@@ -0,0 +1,229 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg">
|
||||
<metadata></metadata>
|
||||
<defs>
|
||||
<font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
|
||||
<font-face units-per-em="1200" ascent="960" descent="-240" />
|
||||
<missing-glyph horiz-adv-x="500" />
|
||||
<glyph />
|
||||
<glyph />
|
||||
<glyph unicode="
" />
|
||||
<glyph unicode=" " />
|
||||
<glyph unicode="*" d="M100 500v200h259l-183 183l141 141l183 -183v259h200v-259l183 183l141 -141l-183 -183h259v-200h-259l183 -183l-141 -141l-183 183v-259h-200v259l-183 -183l-141 141l183 183h-259z" />
|
||||
<glyph unicode="+" d="M0 400v300h400v400h300v-400h400v-300h-400v-400h-300v400h-400z" />
|
||||
<glyph unicode=" " />
|
||||
<glyph unicode=" " horiz-adv-x="652" />
|
||||
<glyph unicode=" " horiz-adv-x="1304" />
|
||||
<glyph unicode=" " horiz-adv-x="652" />
|
||||
<glyph unicode=" " horiz-adv-x="1304" />
|
||||
<glyph unicode=" " horiz-adv-x="434" />
|
||||
<glyph unicode=" " horiz-adv-x="326" />
|
||||
<glyph unicode=" " horiz-adv-x="217" />
|
||||
<glyph unicode=" " horiz-adv-x="217" />
|
||||
<glyph unicode=" " horiz-adv-x="163" />
|
||||
<glyph unicode=" " horiz-adv-x="260" />
|
||||
<glyph unicode=" " horiz-adv-x="72" />
|
||||
<glyph unicode=" " horiz-adv-x="260" />
|
||||
<glyph unicode=" " horiz-adv-x="326" />
|
||||
<glyph unicode="€" d="M100 500l100 100h113q0 47 5 100h-218l100 100h135q37 167 112 257q117 141 297 141q242 0 354 -189q60 -103 66 -209h-181q0 55 -25.5 99t-63.5 68t-75 36.5t-67 12.5q-24 0 -52.5 -10t-62.5 -32t-65.5 -67t-50.5 -107h379l-100 -100h-300q-6 -46 -6 -100h406l-100 -100 h-300q9 -74 33 -132t52.5 -91t62 -54.5t59 -29t46.5 -7.5q29 0 66 13t75 37t63.5 67.5t25.5 96.5h174q-31 -172 -128 -278q-107 -117 -274 -117q-205 0 -324 158q-36 46 -69 131.5t-45 205.5h-217z" />
|
||||
<glyph unicode="−" d="M200 400h900v300h-900v-300z" />
|
||||
<glyph unicode="◼" horiz-adv-x="500" d="M0 0z" />
|
||||
<glyph unicode="☁" d="M-14 494q0 -80 56.5 -137t135.5 -57h750q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5z" />
|
||||
<glyph unicode="✉" d="M0 100l400 400l200 -200l200 200l400 -400h-1200zM0 300v600l300 -300zM0 1100l600 -603l600 603h-1200zM900 600l300 300v-600z" />
|
||||
<glyph unicode="✏" d="M-13 -13l333 112l-223 223zM187 403l214 -214l614 614l-214 214zM887 1103l214 -214l99 92q13 13 13 32.5t-13 33.5l-153 153q-15 13 -33 13t-33 -13z" />
|
||||
<glyph unicode="" d="M0 1200h1200l-500 -550v-550h300v-100h-800v100h300v550z" />
|
||||
<glyph unicode="" d="M14 84q18 -55 86 -75.5t147 5.5q65 21 109 69t44 90v606l600 155v-521q-64 16 -138 -7q-79 -26 -122.5 -83t-25.5 -111q18 -55 86 -75.5t147 4.5q70 23 111.5 63.5t41.5 95.5v881q0 10 -7 15.5t-17 2.5l-752 -193q-10 -3 -17 -12.5t-7 -19.5v-689q-64 17 -138 -7 q-79 -25 -122.5 -82t-25.5 -112z" />
|
||||
<glyph unicode="" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233z" />
|
||||
<glyph unicode="" d="M100 784q0 64 28 123t73 100.5t104.5 64t119 20.5t120 -38.5t104.5 -104.5q48 69 109.5 105t121.5 38t118.5 -20.5t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-149.5 152.5t-126.5 127.5 t-94 124.5t-33.5 117.5z" />
|
||||
<glyph unicode="" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1z" />
|
||||
<glyph unicode="" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1zM237 700l196 -142l-73 -226l192 140l195 -141l-74 229l193 140h-235l-77 211l-78 -211h-239z" />
|
||||
<glyph unicode="" d="M0 0v143l400 257v100q-37 0 -68.5 74.5t-31.5 125.5v200q0 124 88 212t212 88t212 -88t88 -212v-200q0 -51 -31.5 -125.5t-68.5 -74.5v-100l400 -257v-143h-1200z" />
|
||||
<glyph unicode="" d="M0 0v1100h1200v-1100h-1200zM100 100h100v100h-100v-100zM100 300h100v100h-100v-100zM100 500h100v100h-100v-100zM100 700h100v100h-100v-100zM100 900h100v100h-100v-100zM300 100h600v400h-600v-400zM300 600h600v400h-600v-400zM1000 100h100v100h-100v-100z M1000 300h100v100h-100v-100zM1000 500h100v100h-100v-100zM1000 700h100v100h-100v-100zM1000 900h100v100h-100v-100z" />
|
||||
<glyph unicode="" d="M0 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM0 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5zM600 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM600 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5z" />
|
||||
<glyph unicode="" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 450v200q0 21 14.5 35.5t35.5 14.5h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5z" />
|
||||
<glyph unicode="" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v200q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5 t-14.5 -35.5v-200zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5z" />
|
||||
<glyph unicode="" d="M29 454l419 -420l818 820l-212 212l-607 -607l-206 207z" />
|
||||
<glyph unicode="" d="M106 318l282 282l-282 282l212 212l282 -282l282 282l212 -212l-282 -282l282 -282l-212 -212l-282 282l-282 -282z" />
|
||||
<glyph unicode="" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233zM300 600v200h100v100h200v-100h100v-200h-100v-100h-200v100h-100z" />
|
||||
<glyph unicode="" d="M23 694q0 200 142 342t342 142t342 -142t142 -342q0 -141 -78 -262l300 -299q7 -7 7 -18t-7 -18l-109 -109q-8 -8 -18 -8t-18 8l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 694q0 -136 97 -233t234 -97t233.5 97t96.5 233t-96.5 233t-233.5 97t-234 -97 t-97 -233zM300 601h400v200h-400v-200z" />
|
||||
<glyph unicode="" d="M23 600q0 183 105 331t272 210v-166q-103 -55 -165 -155t-62 -220q0 -177 125 -302t302 -125t302 125t125 302q0 120 -62 220t-165 155v166q167 -62 272 -210t105 -331q0 -118 -45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5 zM500 750q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v400q0 21 -14.5 35.5t-35.5 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-400z" />
|
||||
<glyph unicode="" d="M100 1h200v300h-200v-300zM400 1v500h200v-500h-200zM700 1v800h200v-800h-200zM1000 1v1200h200v-1200h-200z" />
|
||||
<glyph unicode="" d="M26 601q0 -33 6 -74l151 -38l2 -6q14 -49 38 -93l3 -5l-80 -134q45 -59 105 -105l133 81l5 -3q45 -26 94 -39l5 -2l38 -151q40 -5 74 -5q27 0 74 5l38 151l6 2q46 13 93 39l5 3l134 -81q56 44 104 105l-80 134l3 5q24 44 39 93l1 6l152 38q5 40 5 74q0 28 -5 73l-152 38 l-1 6q-16 51 -39 93l-3 5l80 134q-44 58 -104 105l-134 -81l-5 3q-45 25 -93 39l-6 1l-38 152q-40 5 -74 5q-27 0 -74 -5l-38 -152l-5 -1q-50 -14 -94 -39l-5 -3l-133 81q-59 -47 -105 -105l80 -134l-3 -5q-25 -47 -38 -93l-2 -6l-151 -38q-6 -48 -6 -73zM385 601 q0 88 63 151t152 63t152 -63t63 -151q0 -89 -63 -152t-152 -63t-152 63t-63 152z" />
|
||||
<glyph unicode="" d="M100 1025v50q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-50q0 -11 -7 -18t-18 -7h-1050q-11 0 -18 7t-7 18zM200 100v800h900v-800q0 -41 -29.5 -71t-70.5 -30h-700q-41 0 -70.5 30 t-29.5 71zM300 100h100v700h-100v-700zM500 100h100v700h-100v-700zM500 1100h300v100h-300v-100zM700 100h100v700h-100v-700zM900 100h100v700h-100v-700z" />
|
||||
<glyph unicode="" d="M1 601l656 644l644 -644h-200v-600h-300v400h-300v-400h-300v600h-200z" />
|
||||
<glyph unicode="" d="M100 25v1150q0 11 7 18t18 7h475v-500h400v-675q0 -11 -7 -18t-18 -7h-850q-11 0 -18 7t-7 18zM700 800v300l300 -300h-300z" />
|
||||
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 500v400h100 v-300h200v-100h-300z" />
|
||||
<glyph unicode="" d="M-100 0l431 1200h209l-21 -300h162l-20 300h208l431 -1200h-538l-41 400h-242l-40 -400h-539zM488 500h224l-27 300h-170z" />
|
||||
<glyph unicode="" d="M0 0v400h490l-290 300h200v500h300v-500h200l-290 -300h490v-400h-1100zM813 200h175v100h-175v-100z" />
|
||||
<glyph unicode="" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM188 600q0 -170 121 -291t291 -121t291 121t121 291t-121 291t-291 121 t-291 -121t-121 -291zM350 600h150v300h200v-300h150l-250 -300z" />
|
||||
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM350 600l250 300 l250 -300h-150v-300h-200v300h-150z" />
|
||||
<glyph unicode="" d="M0 25v475l200 700h800l199 -700l1 -475q0 -11 -7 -18t-18 -7h-1150q-11 0 -18 7t-7 18zM200 500h200l50 -200h300l50 200h200l-97 500h-606z" />
|
||||
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 397v401 l297 -200z" />
|
||||
<glyph unicode="" d="M23 600q0 -118 45.5 -224.5t123 -184t184 -123t224.5 -45.5t224.5 45.5t184 123t123 184t45.5 224.5h-150q0 -177 -125 -302t-302 -125t-302 125t-125 302t125 302t302 125q136 0 246 -81l-146 -146h400v400l-145 -145q-157 122 -355 122q-118 0 -224.5 -45.5t-184 -123 t-123 -184t-45.5 -224.5z" />
|
||||
<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5q198 0 355 -122l145 145v-400h-400l147 147q-112 80 -247 80q-177 0 -302 -125t-125 -302h-150zM100 0v400h400l-147 -147q112 -80 247 -80q177 0 302 125t125 302h150q0 -118 -45.5 -224.5t-123 -184t-184 -123 t-224.5 -45.5q-198 0 -355 122z" />
|
||||
<glyph unicode="" d="M100 0h1100v1200h-1100v-1200zM200 100v900h900v-900h-900zM300 200v100h100v-100h-100zM300 400v100h100v-100h-100zM300 600v100h100v-100h-100zM300 800v100h100v-100h-100zM500 200h500v100h-500v-100zM500 400v100h500v-100h-500zM500 600v100h500v-100h-500z M500 800v100h500v-100h-500z" />
|
||||
<glyph unicode="" d="M0 100v600q0 41 29.5 70.5t70.5 29.5h100v200q0 82 59 141t141 59h300q82 0 141 -59t59 -141v-200h100q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-900q-41 0 -70.5 29.5t-29.5 70.5zM400 800h300v150q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-150z" />
|
||||
<glyph unicode="" d="M100 0v1100h100v-1100h-100zM300 400q60 60 127.5 84t127.5 17.5t122 -23t119 -30t110 -11t103 42t91 120.5v500q-40 -81 -101.5 -115.5t-127.5 -29.5t-138 25t-139.5 40t-125.5 25t-103 -29.5t-65 -115.5v-500z" />
|
||||
<glyph unicode="" d="M0 275q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 127 70.5 231.5t184.5 161.5t245 57t245 -57t184.5 -161.5t70.5 -231.5v-300q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 116 -49.5 227t-131 192.5t-192.5 131t-227 49.5t-227 -49.5t-192.5 -131t-131 -192.5 t-49.5 -227v-300zM200 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14zM800 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14z" />
|
||||
<glyph unicode="" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM688 459l141 141l-141 141l71 71l141 -141l141 141l71 -71l-141 -141l141 -141l-71 -71l-141 141l-141 -141z" />
|
||||
<glyph unicode="" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM700 857l69 53q111 -135 111 -310q0 -169 -106 -302l-67 54q86 110 86 248q0 146 -93 257z" />
|
||||
<glyph unicode="" d="M0 401v400h300l300 200v-800l-300 200h-300zM702 858l69 53q111 -135 111 -310q0 -170 -106 -303l-67 55q86 110 86 248q0 145 -93 257zM889 951l7 -8q123 -151 123 -344q0 -189 -119 -339l-7 -8l81 -66l6 8q142 178 142 405q0 230 -144 408l-6 8z" />
|
||||
<glyph unicode="" d="M0 0h500v500h-200v100h-100v-100h-200v-500zM0 600h100v100h400v100h100v100h-100v300h-500v-600zM100 100v300h300v-300h-300zM100 800v300h300v-300h-300zM200 200v100h100v-100h-100zM200 900h100v100h-100v-100zM500 500v100h300v-300h200v-100h-100v-100h-200v100 h-100v100h100v200h-200zM600 0v100h100v-100h-100zM600 1000h100v-300h200v-300h300v200h-200v100h200v500h-600v-200zM800 800v300h300v-300h-300zM900 0v100h300v-100h-300zM900 900v100h100v-100h-100zM1100 200v100h100v-100h-100z" />
|
||||
<glyph unicode="" d="M0 200h100v1000h-100v-1000zM100 0v100h300v-100h-300zM200 200v1000h100v-1000h-100zM500 0v91h100v-91h-100zM500 200v1000h200v-1000h-200zM700 0v91h100v-91h-100zM800 200v1000h100v-1000h-100zM900 0v91h200v-91h-200zM1000 200v1000h200v-1000h-200z" />
|
||||
<glyph unicode="" d="M0 700l1 475q0 10 7.5 17.5t17.5 7.5h474l700 -700l-500 -500zM148 953q0 -42 29 -71q30 -30 71.5 -30t71.5 30q29 29 29 71t-29 71q-30 30 -71.5 30t-71.5 -30q-29 -29 -29 -71z" />
|
||||
<glyph unicode="" d="M1 700l1 475q0 11 7 18t18 7h474l700 -700l-500 -500zM148 953q0 -42 30 -71q29 -30 71 -30t71 30q30 29 30 71t-30 71q-29 30 -71 30t-71 -30q-30 -29 -30 -71zM701 1200h100l700 -700l-500 -500l-50 50l450 450z" />
|
||||
<glyph unicode="" d="M100 0v1025l175 175h925v-1000l-100 -100v1000h-750l-100 -100h750v-1000h-900z" />
|
||||
<glyph unicode="" d="M200 0l450 444l450 -443v1150q0 20 -14.5 35t-35.5 15h-800q-21 0 -35.5 -15t-14.5 -35v-1151z" />
|
||||
<glyph unicode="" d="M0 100v700h200l100 -200h600l100 200h200v-700h-200v200h-800v-200h-200zM253 829l40 -124h592l62 124l-94 346q-2 11 -10 18t-18 7h-450q-10 0 -18 -7t-10 -18zM281 24l38 152q2 10 11.5 17t19.5 7h500q10 0 19.5 -7t11.5 -17l38 -152q2 -10 -3.5 -17t-15.5 -7h-600 q-10 0 -15.5 7t-3.5 17z" />
|
||||
<glyph unicode="" d="M0 200q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-150q-4 8 -11.5 21.5t-33 48t-53 61t-69 48t-83.5 21.5h-200q-41 0 -82 -20.5t-70 -50t-52 -59t-34 -50.5l-12 -20h-150q-41 0 -70.5 -29.5t-29.5 -70.5v-600z M356 500q0 100 72 172t172 72t172 -72t72 -172t-72 -172t-172 -72t-172 72t-72 172zM494 500q0 -44 31 -75t75 -31t75 31t31 75t-31 75t-75 31t-75 -31t-31 -75zM900 700v100h100v-100h-100z" />
|
||||
<glyph unicode="" d="M53 0h365v66q-41 0 -72 11t-49 38t1 71l92 234h391l82 -222q16 -45 -5.5 -88.5t-74.5 -43.5v-66h417v66q-34 1 -74 43q-18 19 -33 42t-21 37l-6 13l-385 998h-93l-399 -1006q-24 -48 -52 -75q-12 -12 -33 -25t-36 -20l-15 -7v-66zM416 521l178 457l46 -140l116 -317h-340 z" />
|
||||
<glyph unicode="" d="M100 0v89q41 7 70.5 32.5t29.5 65.5v827q0 28 -1 39.5t-5.5 26t-15.5 21t-29 14t-49 14.5v71l471 -1q120 0 213 -88t93 -228q0 -55 -11.5 -101.5t-28 -74t-33.5 -47.5t-28 -28l-12 -7q8 -3 21.5 -9t48 -31.5t60.5 -58t47.5 -91.5t21.5 -129q0 -84 -59 -156.5t-142 -111 t-162 -38.5h-500zM400 200h161q89 0 153 48.5t64 132.5q0 90 -62.5 154.5t-156.5 64.5h-159v-400zM400 700h139q76 0 130 61.5t54 138.5q0 82 -84 130.5t-239 48.5v-379z" />
|
||||
<glyph unicode="" d="M200 0v57q77 7 134.5 40.5t65.5 80.5l173 849q10 56 -10 74t-91 37q-6 1 -10.5 2.5t-9.5 2.5v57h425l2 -57q-33 -8 -62 -25.5t-46 -37t-29.5 -38t-17.5 -30.5l-5 -12l-128 -825q-10 -52 14 -82t95 -36v-57h-500z" />
|
||||
<glyph unicode="" d="M-75 200h75v800h-75l125 167l125 -167h-75v-800h75l-125 -167zM300 900v300h150h700h150v-300h-50q0 29 -8 48.5t-18.5 30t-33.5 15t-39.5 5.5t-50.5 1h-200v-850l100 -50v-100h-400v100l100 50v850h-200q-34 0 -50.5 -1t-40 -5.5t-33.5 -15t-18.5 -30t-8.5 -48.5h-49z " />
|
||||
<glyph unicode="" d="M33 51l167 125v-75h800v75l167 -125l-167 -125v75h-800v-75zM100 901v300h150h700h150v-300h-50q0 29 -8 48.5t-18 30t-33.5 15t-40 5.5t-50.5 1h-200v-650l100 -50v-100h-400v100l100 50v650h-200q-34 0 -50.5 -1t-39.5 -5.5t-33.5 -15t-18.5 -30t-8 -48.5h-50z" />
|
||||
<glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 350q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM0 650q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1000q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 950q0 -20 14.5 -35t35.5 -15h600q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-600q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
|
||||
<glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 650q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM200 350q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM200 950q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
|
||||
<glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1000q-21 0 -35.5 15 t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-600 q-21 0 -35.5 15t-14.5 35z" />
|
||||
<glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100 q-21 0 -35.5 15t-14.5 35z" />
|
||||
<glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM300 50v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800 q-21 0 -35.5 15t-14.5 35zM300 650v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 950v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15 h-800q-21 0 -35.5 15t-14.5 35z" />
|
||||
<glyph unicode="" d="M-101 500v100h201v75l166 -125l-166 -125v75h-201zM300 0h100v1100h-100v-1100zM500 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35 v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 650q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100 q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100z" />
|
||||
<glyph unicode="" d="M1 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 650 q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM801 0v1100h100v-1100 h-100zM934 550l167 -125v75h200v100h-200v75z" />
|
||||
<glyph unicode="" d="M0 275v650q0 31 22 53t53 22h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53zM900 600l300 300v-600z" />
|
||||
<glyph unicode="" d="M0 44v1012q0 18 13 31t31 13h1112q19 0 31.5 -13t12.5 -31v-1012q0 -18 -12.5 -31t-31.5 -13h-1112q-18 0 -31 13t-13 31zM100 263l247 182l298 -131l-74 156l293 318l236 -288v500h-1000v-737zM208 750q0 56 39 95t95 39t95 -39t39 -95t-39 -95t-95 -39t-95 39t-39 95z " />
|
||||
<glyph unicode="" d="M148 745q0 124 60.5 231.5t165 172t226.5 64.5q123 0 227 -63t164.5 -169.5t60.5 -229.5t-73 -272q-73 -114 -166.5 -237t-150.5 -189l-57 -66q-10 9 -27 26t-66.5 70.5t-96 109t-104 135.5t-100.5 155q-63 139 -63 262zM342 772q0 -107 75.5 -182.5t181.5 -75.5 q107 0 182.5 75.5t75.5 182.5t-75.5 182t-182.5 75t-182 -75.5t-75 -181.5z" />
|
||||
<glyph unicode="" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM173 600q0 -177 125.5 -302t301.5 -125v854q-176 0 -301.5 -125 t-125.5 -302z" />
|
||||
<glyph unicode="" d="M117 406q0 94 34 186t88.5 172.5t112 159t115 177t87.5 194.5q21 -71 57.5 -142.5t76 -130.5t83 -118.5t82 -117t70 -116t50 -125.5t18.5 -136q0 -89 -39 -165.5t-102 -126.5t-140 -79.5t-156 -33.5q-114 6 -211.5 53t-161.5 139t-64 210zM243 414q14 -82 59.5 -136 t136.5 -80l16 98q-7 6 -18 17t-34 48t-33 77q-15 73 -14 143.5t10 122.5l9 51q-92 -110 -119.5 -185t-12.5 -156z" />
|
||||
<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5q366 -6 397 -14l-186 -186h-311q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v125l200 200v-225q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM436 341l161 50l412 412l-114 113l-405 -405zM995 1015l113 -113l113 113l-21 85l-92 28z" />
|
||||
<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h261l2 -80q-133 -32 -218 -120h-145q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-53q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5 zM423 524q30 38 81.5 64t103 35.5t99 14t77.5 3.5l29 -1v-209l360 324l-359 318v-216q-7 0 -19 -1t-48 -8t-69.5 -18.5t-76.5 -37t-76.5 -59t-62 -88t-39.5 -121.5z" />
|
||||
<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q61 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-169q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM342 632l283 -284l567 567l-137 137l-430 -431l-146 147z" />
|
||||
<glyph unicode="" d="M0 603l300 296v-198h200v200h-200l300 300l295 -300h-195v-200h200v198l300 -296l-300 -300v198h-200v-200h195l-295 -300l-300 300h200v200h-200v-198z" />
|
||||
<glyph unicode="" d="M200 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-1100l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
|
||||
<glyph unicode="" d="M0 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-487l500 487v-1100l-500 488v-488l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
|
||||
<glyph unicode="" d="M136 550l564 550v-487l500 487v-1100l-500 488v-488z" />
|
||||
<glyph unicode="" d="M200 0l900 550l-900 550v-1100z" />
|
||||
<glyph unicode="" d="M200 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800zM600 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
|
||||
<glyph unicode="" d="M200 150q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v800q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
|
||||
<glyph unicode="" d="M0 0v1100l500 -487v487l564 -550l-564 -550v488z" />
|
||||
<glyph unicode="" d="M0 0v1100l500 -487v487l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-500 -488v488z" />
|
||||
<glyph unicode="" d="M300 0v1100l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438z" />
|
||||
<glyph unicode="" d="M100 250v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5zM100 500h1100l-550 564z" />
|
||||
<glyph unicode="" d="M185 599l592 -592l240 240l-353 353l353 353l-240 240z" />
|
||||
<glyph unicode="" d="M272 194l353 353l-353 353l241 240l572 -571l21 -22l-1 -1v-1l-592 -591z" />
|
||||
<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h200v-200h200v200h200v200h-200v200h-200v-200h-200v-200z" />
|
||||
<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h600v200h-600v-200z" />
|
||||
<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM246 459l213 -213l141 142l141 -142l213 213l-142 141l142 141l-213 212l-141 -141l-141 142l-212 -213l141 -141 z" />
|
||||
<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM270 551l276 -277l411 411l-175 174l-236 -236l-102 102z" />
|
||||
<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM364 700h143q4 0 11.5 -1t11 -1t6.5 3t3 9t1 11t3.5 8.5t3.5 6t5.5 4t6.5 2.5t9 1.5t9 0.5h11.5h12.5 q19 0 30 -10t11 -26q0 -22 -4 -28t-27 -22q-5 -1 -12.5 -3t-27 -13.5t-34 -27t-26.5 -46t-11 -68.5h200q5 3 14 8t31.5 25.5t39.5 45.5t31 69t14 94q0 51 -17.5 89t-42 58t-58.5 32t-58.5 15t-51.5 3q-50 0 -90.5 -12t-75 -38.5t-53.5 -74.5t-19 -114zM500 300h200v100h-200 v-100z" />
|
||||
<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM400 300h400v100h-100v300h-300v-100h100v-200h-100v-100zM500 800h200v100h-200v-100z" />
|
||||
<glyph unicode="" d="M0 500v200h195q31 125 98.5 199.5t206.5 100.5v200h200v-200q54 -20 113 -60t112.5 -105.5t71.5 -134.5h203v-200h-203q-25 -102 -116.5 -186t-180.5 -117v-197h-200v197q-140 27 -208 102.5t-98 200.5h-194zM290 500q24 -73 79.5 -127.5t130.5 -78.5v206h200v-206 q149 48 201 206h-201v200h200q-25 74 -75.5 127t-124.5 77v-204h-200v203q-75 -23 -130 -77t-79 -126h209v-200h-210z" />
|
||||
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM356 465l135 135 l-135 135l109 109l135 -135l135 135l109 -109l-135 -135l135 -135l-109 -109l-135 135l-135 -135z" />
|
||||
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM322 537l141 141 l87 -87l204 205l142 -142l-346 -345z" />
|
||||
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -115 62 -215l568 567q-100 62 -216 62q-171 0 -292.5 -121.5t-121.5 -292.5zM391 245q97 -59 209 -59q171 0 292.5 121.5t121.5 292.5 q0 112 -59 209z" />
|
||||
<glyph unicode="" d="M0 547l600 453v-300h600v-300h-600v-301z" />
|
||||
<glyph unicode="" d="M0 400v300h600v300l600 -453l-600 -448v301h-600z" />
|
||||
<glyph unicode="" d="M204 600l450 600l444 -600h-298v-600h-300v600h-296z" />
|
||||
<glyph unicode="" d="M104 600h296v600h300v-600h298l-449 -600z" />
|
||||
<glyph unicode="" d="M0 200q6 132 41 238.5t103.5 193t184 138t271.5 59.5v271l600 -453l-600 -448v301q-95 -2 -183 -20t-170 -52t-147 -92.5t-100 -135.5z" />
|
||||
<glyph unicode="" d="M0 0v400l129 -129l294 294l142 -142l-294 -294l129 -129h-400zM635 777l142 -142l294 294l129 -129v400h-400l129 -129z" />
|
||||
<glyph unicode="" d="M34 176l295 295l-129 129h400v-400l-129 130l-295 -295zM600 600v400l129 -129l295 295l142 -141l-295 -295l129 -130h-400z" />
|
||||
<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM456 851l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5 t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5h-207q-21 0 -33 -14.5t-8 -34.5zM500 300h200v100h-200v-100z" />
|
||||
<glyph unicode="" d="M0 800h100v-200h400v300h200v-300h400v200h100v100h-111q1 1 1 6.5t-1.5 15t-3.5 17.5l-34 172q-11 39 -41.5 63t-69.5 24q-32 0 -61 -17l-239 -144q-22 -13 -40 -35q-19 24 -40 36l-238 144q-33 18 -62 18q-39 0 -69.5 -23t-40.5 -61l-35 -177q-2 -8 -3 -18t-1 -15v-6 h-111v-100zM100 0h400v400h-400v-400zM200 900q-3 0 14 48t36 96l18 47l213 -191h-281zM700 0v400h400v-400h-400zM731 900l202 197q5 -12 12 -32.5t23 -64t25 -72t7 -28.5h-269z" />
|
||||
<glyph unicode="" d="M0 -22v143l216 193q-9 53 -13 83t-5.5 94t9 113t38.5 114t74 124q47 60 99.5 102.5t103 68t127.5 48t145.5 37.5t184.5 43.5t220 58.5q0 -189 -22 -343t-59 -258t-89 -181.5t-108.5 -120t-122 -68t-125.5 -30t-121.5 -1.5t-107.5 12.5t-87.5 17t-56.5 7.5l-99 -55z M238.5 300.5q19.5 -6.5 86.5 76.5q55 66 367 234q70 38 118.5 69.5t102 79t99 111.5t86.5 148q22 50 24 60t-6 19q-7 5 -17 5t-26.5 -14.5t-33.5 -39.5q-35 -51 -113.5 -108.5t-139.5 -89.5l-61 -32q-369 -197 -458 -401q-48 -111 -28.5 -117.5z" />
|
||||
<glyph unicode="" d="M111 408q0 -33 5 -63q9 -56 44 -119.5t105 -108.5q31 -21 64 -16t62 23.5t57 49.5t48 61.5t35 60.5q32 66 39 184.5t-13 157.5q79 -80 122 -164t26 -184q-5 -33 -20.5 -69.5t-37.5 -80.5q-10 -19 -14.5 -29t-12 -26t-9 -23.5t-3 -19t2.5 -15.5t11 -9.5t19.5 -5t30.5 2.5 t42 8q57 20 91 34t87.5 44.5t87 64t65.5 88.5t47 122q38 172 -44.5 341.5t-246.5 278.5q22 -44 43 -129q39 -159 -32 -154q-15 2 -33 9q-79 33 -120.5 100t-44 175.5t48.5 257.5q-13 -8 -34 -23.5t-72.5 -66.5t-88.5 -105.5t-60 -138t-8 -166.5q2 -12 8 -41.5t8 -43t6 -39.5 t3.5 -39.5t-1 -33.5t-6 -31.5t-13.5 -24t-21 -20.5t-31 -12q-38 -10 -67 13t-40.5 61.5t-15 81.5t10.5 75q-52 -46 -83.5 -101t-39 -107t-7.5 -85z" />
|
||||
<glyph unicode="" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5t145.5 -23.5t132.5 -59t116.5 -83.5t97 -90t74.5 -85.5t49 -63.5t20 -30l26 -40l-26 -40q-6 -10 -20 -30t-49 -63.5t-74.5 -85.5t-97 -90t-116.5 -83.5t-132.5 -59t-145.5 -23.5 t-145.5 23.5t-132.5 59t-116.5 83.5t-97 90t-74.5 85.5t-49 63.5t-20 30zM120 600q7 -10 40.5 -58t56 -78.5t68 -77.5t87.5 -75t103 -49.5t125 -21.5t123.5 20t100.5 45.5t85.5 71.5t66.5 75.5t58 81.5t47 66q-1 1 -28.5 37.5t-42 55t-43.5 53t-57.5 63.5t-58.5 54 q49 -74 49 -163q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l105 105q-37 24 -75 72t-57 84l-20 36z" />
|
||||
<glyph unicode="" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5q61 0 121 -17l37 142h148l-314 -1200h-148l37 143q-82 21 -165 71.5t-140 102t-109.5 112t-72 88.5t-29.5 43zM120 600q210 -282 393 -336l37 141q-107 18 -178.5 101.5t-71.5 193.5 q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l47 47l23 87q-30 28 -59 69t-44 68l-14 26zM780 161l38 145q22 15 44.5 34t46 44t40.5 44t41 50.5t33.5 43.5t33 44t24.5 34q-97 127 -140 175l39 146q67 -54 131.5 -125.5t87.5 -103.5t36 -52l26 -40l-26 -40 q-7 -12 -25.5 -38t-63.5 -79.5t-95.5 -102.5t-124 -100t-146.5 -79z" />
|
||||
<glyph unicode="" d="M-97.5 34q13.5 -34 50.5 -34h1294q37 0 50.5 35.5t-7.5 67.5l-642 1056q-20 34 -48 36.5t-48 -29.5l-642 -1066q-21 -32 -7.5 -66zM155 200l445 723l445 -723h-345v100h-200v-100h-345zM500 600l100 -300l100 300v100h-200v-100z" />
|
||||
<glyph unicode="" d="M100 262v41q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44t106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -91 100 -113v-64q0 -20 -13 -28.5t-32 0.5l-94 78h-222l-94 -78q-19 -9 -32 -0.5t-13 28.5 v64q0 22 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5z" />
|
||||
<glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v750h-1100v-750zM0 900h1100v150q0 21 -14.5 35.5t-35.5 14.5h-150v100h-100v-100h-500v100h-100v-100h-150q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 100v100h100v-100h-100zM100 300v100h100v-100h-100z M100 500v100h100v-100h-100zM300 100v100h100v-100h-100zM300 300v100h100v-100h-100zM300 500v100h100v-100h-100zM500 100v100h100v-100h-100zM500 300v100h100v-100h-100zM500 500v100h100v-100h-100zM700 100v100h100v-100h-100zM700 300v100h100v-100h-100zM700 500 v100h100v-100h-100zM900 100v100h100v-100h-100zM900 300v100h100v-100h-100zM900 500v100h100v-100h-100z" />
|
||||
<glyph unicode="" d="M0 200v200h259l600 600h241v198l300 -295l-300 -300v197h-159l-600 -600h-341zM0 800h259l122 -122l141 142l-181 180h-341v-200zM678 381l141 142l122 -123h159v198l300 -295l-300 -300v197h-241z" />
|
||||
<glyph unicode="" d="M0 400v600q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5z" />
|
||||
<glyph unicode="" d="M100 600v200h300v-250q0 -113 6 -145q17 -92 102 -117q39 -11 92 -11q37 0 66.5 5.5t50 15.5t36 24t24 31.5t14 37.5t7 42t2.5 45t0 47v25v250h300v-200q0 -42 -3 -83t-15 -104t-31.5 -116t-58 -109.5t-89 -96.5t-129 -65.5t-174.5 -25.5t-174.5 25.5t-129 65.5t-89 96.5 t-58 109.5t-31.5 116t-15 104t-3 83zM100 900v300h300v-300h-300zM800 900v300h300v-300h-300z" />
|
||||
<glyph unicode="" d="M-30 411l227 -227l352 353l353 -353l226 227l-578 579z" />
|
||||
<glyph unicode="" d="M70 797l580 -579l578 579l-226 227l-353 -353l-352 353z" />
|
||||
<glyph unicode="" d="M-198 700l299 283l300 -283h-203v-400h385l215 -200h-800v600h-196zM402 1000l215 -200h381v-400h-198l299 -283l299 283h-200v600h-796z" />
|
||||
<glyph unicode="" d="M18 939q-5 24 10 42q14 19 39 19h896l38 162q5 17 18.5 27.5t30.5 10.5h94q20 0 35 -14.5t15 -35.5t-15 -35.5t-35 -14.5h-54l-201 -961q-2 -4 -6 -10.5t-19 -17.5t-33 -11h-31v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-300v-50q0 -20 -14.5 -35t-35.5 -15 t-35.5 15t-14.5 35v50h-50q-21 0 -35.5 15t-14.5 35q0 21 14.5 35.5t35.5 14.5h535l48 200h-633q-32 0 -54.5 21t-27.5 43z" />
|
||||
<glyph unicode="" d="M0 0v800h1200v-800h-1200zM0 900v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-100h-1200z" />
|
||||
<glyph unicode="" d="M1 0l300 700h1200l-300 -700h-1200zM1 400v600h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-200h-1000z" />
|
||||
<glyph unicode="" d="M302 300h198v600h-198l298 300l298 -300h-198v-600h198l-298 -300z" />
|
||||
<glyph unicode="" d="M0 600l300 298v-198h600v198l300 -298l-300 -297v197h-600v-197z" />
|
||||
<glyph unicode="" d="M0 100v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM31 400l172 739q5 22 23 41.5t38 19.5h672q19 0 37.5 -22.5t23.5 -45.5l172 -732h-1138zM800 100h100v100h-100v-100z M1000 100h100v100h-100v-100z" />
|
||||
<glyph unicode="" d="M-101 600v50q0 24 25 49t50 38l25 13v-250l-11 5.5t-24 14t-30 21.5t-24 27.5t-11 31.5zM100 500v250v8v8v7t0.5 7t1.5 5.5t2 5t3 4t4.5 3.5t6 1.5t7.5 0.5h200l675 250v-850l-675 200h-38l47 -276q2 -12 -3 -17.5t-11 -6t-21 -0.5h-8h-83q-20 0 -34.5 14t-18.5 35 q-55 337 -55 351zM1100 200v850q0 21 14.5 35.5t35.5 14.5q20 0 35 -14.5t15 -35.5v-850q0 -20 -15 -35t-35 -15q-21 0 -35.5 15t-14.5 35z" />
|
||||
<glyph unicode="" d="M74 350q0 21 13.5 35.5t33.5 14.5h18l117 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3 32t29 13h94q20 0 29 -10.5t3 -29.5q-18 -36 -18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q20 0 33.5 -14.5t13.5 -35.5q0 -20 -13 -40t-31 -27q-8 -3 -23 -8.5 t-65 -20t-103 -25t-132.5 -19.5t-158.5 -9q-125 0 -245.5 20.5t-178.5 40.5l-58 20q-18 7 -31 27.5t-13 40.5zM497 110q12 -49 40 -79.5t63 -30.5t63 30.5t39 79.5q-48 -6 -102 -6t-103 6z" />
|
||||
<glyph unicode="" d="M21 445l233 -45l-78 -224l224 78l45 -233l155 179l155 -179l45 233l224 -78l-78 224l234 45l-180 155l180 156l-234 44l78 225l-224 -78l-45 233l-155 -180l-155 180l-45 -233l-224 78l78 -225l-233 -44l179 -156z" />
|
||||
<glyph unicode="" d="M0 200h200v600h-200v-600zM300 275q0 -75 100 -75h61q124 -100 139 -100h250q46 0 83 57l238 344q29 31 29 74v100q0 44 -30.5 84.5t-69.5 40.5h-328q28 118 28 125v150q0 44 -30.5 84.5t-69.5 40.5h-50q-27 0 -51 -20t-38 -48l-96 -198l-145 -196q-20 -26 -20 -63v-400z M400 300v375l150 213l100 212h50v-175l-50 -225h450v-125l-250 -375h-214l-136 100h-100z" />
|
||||
<glyph unicode="" d="M0 400v600h200v-600h-200zM300 525v400q0 75 100 75h61q124 100 139 100h250q46 0 83 -57l238 -344q29 -31 29 -74v-100q0 -44 -30.5 -84.5t-69.5 -40.5h-328q28 -118 28 -125v-150q0 -44 -30.5 -84.5t-69.5 -40.5h-50q-27 0 -51 20t-38 48l-96 198l-145 196 q-20 26 -20 63zM400 525l150 -212l100 -213h50v175l-50 225h450v125l-250 375h-214l-136 -100h-100v-375z" />
|
||||
<glyph unicode="" d="M8 200v600h200v-600h-200zM308 275v525q0 17 14 35.5t28 28.5l14 9l362 230q14 6 25 6q17 0 29 -12l109 -112q14 -14 14 -34q0 -18 -11 -32l-85 -121h302q85 0 138.5 -38t53.5 -110t-54.5 -111t-138.5 -39h-107l-130 -339q-7 -22 -20.5 -41.5t-28.5 -19.5h-341 q-7 0 -90 81t-83 94zM408 289l100 -89h293l131 339q6 21 19.5 41t28.5 20h203q16 0 25 15t9 36q0 20 -9 34.5t-25 14.5h-457h-6.5h-7.5t-6.5 0.5t-6 1t-5 1.5t-5.5 2.5t-4 4t-4 5.5q-5 12 -5 20q0 14 10 27l147 183l-86 83l-339 -236v-503z" />
|
||||
<glyph unicode="" d="M-101 651q0 72 54 110t139 38l302 -1l-85 121q-11 16 -11 32q0 21 14 34l109 113q13 12 29 12q11 0 25 -6l365 -230q7 -4 17 -10.5t26.5 -26t16.5 -36.5v-526q0 -13 -86 -93.5t-94 -80.5h-341q-16 0 -29.5 20t-19.5 41l-130 339h-107q-84 0 -139 39t-55 111zM-1 601h222 q15 0 28.5 -20.5t19.5 -40.5l131 -339h293l107 89v502l-343 237l-87 -83l145 -184q10 -11 10 -26q0 -11 -5 -20q-1 -3 -3.5 -5.5l-4 -4t-5 -2.5t-5.5 -1.5t-6.5 -1t-6.5 -0.5h-7.5h-6.5h-476v-100zM1000 201v600h200v-600h-200z" />
|
||||
<glyph unicode="" d="M97 719l230 -363q4 -6 10.5 -15.5t26 -25t36.5 -15.5h525q13 0 94 83t81 90v342q0 15 -20 28.5t-41 19.5l-339 131v106q0 84 -39 139t-111 55t-110 -53.5t-38 -138.5v-302l-121 84q-15 12 -33.5 11.5t-32.5 -13.5l-112 -110q-22 -22 -6 -53zM172 739l83 86l183 -146 q22 -18 47 -5q3 1 5.5 3.5l4 4t2.5 5t1.5 5.5t1 6.5t0.5 6.5v7.5v6.5v456q0 22 25 31t50 -0.5t25 -30.5v-202q0 -16 20 -29.5t41 -19.5l339 -130v-294l-89 -100h-503zM400 0v200h600v-200h-600z" />
|
||||
<glyph unicode="" d="M2 585q-16 -31 6 -53l112 -110q13 -13 32 -13.5t34 10.5l121 85q0 -51 -0.5 -153.5t-0.5 -148.5q0 -84 38.5 -138t110.5 -54t111 55t39 139v106l339 131q20 6 40.5 19.5t20.5 28.5v342q0 7 -81 90t-94 83h-525q-17 0 -35.5 -14t-28.5 -28l-10 -15zM77 565l236 339h503 l89 -100v-294l-340 -130q-20 -6 -40 -20t-20 -29v-202q0 -22 -25 -31t-50 0t-25 31v456v14.5t-1.5 11.5t-5 12t-9.5 7q-24 13 -46 -5l-184 -146zM305 1104v200h600v-200h-600z" />
|
||||
<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM298 701l2 -201h300l-2 -194l402 294l-402 298v-197h-300z" />
|
||||
<glyph unicode="" d="M0 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t231.5 47.5q122 0 232.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-218 -217.5t-300 -80t-299.5 80t-217.5 217.5t-80 299.5zM200 600l402 -294l-2 194h300l2 201h-300v197z" />
|
||||
<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600h200v-300h200v300h200l-300 400z" />
|
||||
<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600l300 -400l300 400h-200v300h-200v-300h-200z" />
|
||||
<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM254 780q-8 -33 5.5 -92.5t7.5 -87.5q0 -9 17 -44t16 -60 q12 0 23 -5.5t23 -15t20 -13.5q24 -12 108 -42q22 -8 53 -31.5t59.5 -38.5t57.5 -11q8 -18 -15 -55t-20 -57q42 -71 87 -80q0 -6 -3 -15.5t-3.5 -14.5t4.5 -17q104 -3 221 112q30 29 47 47t34.5 49t20.5 62q-14 9 -37 9.5t-36 7.5q-14 7 -49 15t-52 19q-9 0 -39.5 -0.5 t-46.5 -1.5t-39 -6.5t-39 -16.5q-50 -35 -66 -12q-4 2 -3.5 25.5t0.5 25.5q-6 13 -26.5 17t-24.5 7q2 22 -2 41t-16.5 28t-38.5 -20q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q12 -19 32 -37.5t34 -27.5l14 -8q0 3 9.5 39.5t5.5 57.5 q-4 23 14.5 44.5t22.5 31.5q5 14 10 35t8.5 31t15.5 22.5t34 21.5q-6 18 10 37q8 0 23.5 -1.5t24.5 -1.5t20.5 4.5t20.5 15.5q-10 23 -30.5 42.5t-38 30t-49 26.5t-43.5 23q11 39 2 44q31 -13 58 -14.5t39 3.5l11 4q7 36 -16.5 53.5t-64.5 28.5t-56 23q-19 -3 -37 0 q-15 -12 -36.5 -21t-34.5 -12t-44 -8t-39 -6q-15 -3 -45.5 0.5t-45.5 -2.5q-21 -7 -52 -26.5t-34 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -90.5t-29.5 -79.5zM518 916q3 12 16 30t16 25q10 -10 18.5 -10t14 6t14.5 14.5t16 12.5q0 -24 17 -66.5t17 -43.5 q-9 2 -31 5t-36 5t-32 8t-30 14zM692 1003h1h-1z" />
|
||||
<glyph unicode="" d="M0 164.5q0 21.5 15 37.5l600 599q-33 101 6 201.5t135 154.5q164 92 306 -9l-259 -138l145 -232l251 126q13 -175 -151 -267q-123 -70 -253 -23l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5z" />
|
||||
<glyph unicode="" horiz-adv-x="1220" d="M0 196v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 596v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5zM0 996v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM600 596h500v100h-500v-100zM800 196h300v100h-300v-100zM900 996h200v100h-200v-100z" />
|
||||
<glyph unicode="" d="M100 1100v100h1000v-100h-1000zM150 1000h900l-350 -500v-300l-200 -200v500z" />
|
||||
<glyph unicode="" d="M0 200v200h1200v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500z M500 1000h200v100h-200v-100z" />
|
||||
<glyph unicode="" d="M0 0v400l129 -129l200 200l142 -142l-200 -200l129 -129h-400zM0 800l129 129l200 -200l142 142l-200 200l129 129h-400v-400zM729 329l142 142l200 -200l129 129v-400h-400l129 129zM729 871l200 200l-129 129h400v-400l-129 129l-200 -200z" />
|
||||
<glyph unicode="" d="M0 596q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 596q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM291 655 q0 23 15.5 38.5t38.5 15.5t39 -16t16 -38q0 -23 -16 -39t-39 -16q-22 0 -38 16t-16 39zM400 850q0 22 16 38.5t39 16.5q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16.5t-16 38.5zM514 609q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 22 16 38.5t39 16.5 q22 0 38 -16t16 -39t-16 -39t-38 -16q-14 0 -29 10l-55 -145q17 -22 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5zM800 655q0 22 16 38t39 16t38.5 -15.5t15.5 -38.5t-16 -39t-38 -16q-23 0 -39 16t-16 39z" />
|
||||
<glyph unicode="" d="M-40 375q-13 -95 35 -173q35 -57 94 -89t129 -32q63 0 119 28q33 16 65 40.5t52.5 45.5t59.5 64q40 44 57 61l394 394q35 35 47 84t-3 96q-27 87 -117 104q-20 2 -29 2q-46 0 -78.5 -16.5t-67.5 -51.5l-389 -396l-7 -7l69 -67l377 373q20 22 39 38q23 23 50 23 q38 0 53 -36q16 -39 -20 -75l-547 -547q-52 -52 -125 -52q-55 0 -100 33t-54 96q-5 35 2.5 66t31.5 63t42 50t56 54q24 21 44 41l348 348q52 52 82.5 79.5t84 54t107.5 26.5q25 0 48 -4q95 -17 154 -94.5t51 -175.5q-7 -101 -98 -192l-252 -249l-253 -256l7 -7l69 -60 l517 511q67 67 95 157t11 183q-16 87 -67 154t-130 103q-69 33 -152 33q-107 0 -197 -55q-40 -24 -111 -95l-512 -512q-68 -68 -81 -163z" />
|
||||
<glyph unicode="" d="M80 784q0 131 98.5 229.5t230.5 98.5q143 0 241 -129q103 129 246 129q129 0 226 -98.5t97 -229.5q0 -46 -17.5 -91t-61 -99t-77 -89.5t-104.5 -105.5q-197 -191 -293 -322l-17 -23l-16 23q-43 58 -100 122.5t-92 99.5t-101 100q-71 70 -104.5 105.5t-77 89.5t-61 99 t-17.5 91zM250 784q0 -27 30.5 -70t61.5 -75.5t95 -94.5l22 -22q93 -90 190 -201q82 92 195 203l12 12q64 62 97.5 97t64.5 79t31 72q0 71 -48 119.5t-105 48.5q-74 0 -132 -83l-118 -171l-114 174q-51 80 -123 80q-60 0 -109.5 -49.5t-49.5 -118.5z" />
|
||||
<glyph unicode="" d="M57 353q0 -95 66 -159l141 -142q68 -66 159 -66q93 0 159 66l283 283q66 66 66 159t-66 159l-141 141q-8 9 -19 17l-105 -105l212 -212l-389 -389l-247 248l95 95l-18 18q-46 45 -75 101l-55 -55q-66 -66 -66 -159zM269 706q0 -93 66 -159l141 -141q7 -7 19 -17l105 105 l-212 212l389 389l247 -247l-95 -96l18 -17q47 -49 77 -100l29 29q35 35 62.5 88t27.5 96q0 93 -66 159l-141 141q-66 66 -159 66q-95 0 -159 -66l-283 -283q-66 -64 -66 -159z" />
|
||||
<glyph unicode="" d="M200 100v953q0 21 30 46t81 48t129 38t163 15t162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5zM300 300h600v700h-600v-700zM496 150q0 -43 30.5 -73.5t73.5 -30.5t73.5 30.5t30.5 73.5t-30.5 73.5t-73.5 30.5 t-73.5 -30.5t-30.5 -73.5z" />
|
||||
<glyph unicode="" d="M0 0l303 380l207 208l-210 212h300l267 279l-35 36q-15 14 -15 35t15 35q14 15 35 15t35 -15l283 -282q15 -15 15 -36t-15 -35q-14 -15 -35 -15t-35 15l-36 35l-279 -267v-300l-212 210l-208 -207z" />
|
||||
<glyph unicode="" d="M295 433h139q5 -77 48.5 -126.5t117.5 -64.5v335q-6 1 -15.5 4t-11.5 3q-46 14 -79 26.5t-72 36t-62.5 52t-40 72.5t-16.5 99q0 92 44 159.5t109 101t144 40.5v78h100v-79q38 -4 72.5 -13.5t75.5 -31.5t71 -53.5t51.5 -84t24.5 -118.5h-159q-8 72 -35 109.5t-101 50.5 v-307l64 -14q34 -7 64 -16.5t70 -31.5t67.5 -52t47.5 -80.5t20 -112.5q0 -139 -89 -224t-244 -96v-77h-100v78q-152 17 -237 104q-40 40 -52.5 93.5t-15.5 139.5zM466 889q0 -29 8 -51t16.5 -34t29.5 -22.5t31 -13.5t38 -10q7 -2 11 -3v274q-61 -8 -97.5 -37.5t-36.5 -102.5 zM700 237q170 18 170 151q0 64 -44 99.5t-126 60.5v-311z" />
|
||||
<glyph unicode="" d="M100 600v100h166q-24 49 -44 104q-10 26 -14.5 55.5t-3 72.5t25 90t68.5 87q97 88 263 88q129 0 230 -89t101 -208h-153q0 52 -34 89.5t-74 51.5t-76 14q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -28 16.5 -69.5t28 -62.5t41.5 -72h241v-100h-197q8 -50 -2.5 -115 t-31.5 -94q-41 -59 -99 -113q35 11 84 18t70 7q33 1 103 -16t103 -17q76 0 136 30l50 -147q-41 -25 -80.5 -36.5t-59 -13t-61.5 -1.5q-23 0 -128 33t-155 29q-39 -4 -82 -17t-66 -25l-24 -11l-55 145l16.5 11t15.5 10t13.5 9.5t14.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221z" />
|
||||
<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM602 900l298 300l298 -300h-198v-900h-200v900h-198z" />
|
||||
<glyph unicode="" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v200h100v-100h200v-100h-300zM700 400v100h300v-200h-99v-100h-100v100h99v100h-200zM700 700v500h300v-500h-100v100h-100v-100h-100zM801 900h100v200h-100v-200z" />
|
||||
<glyph unicode="" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v500h300v-500h-100v100h-100v-100h-100zM700 700v200h100v-100h200v-100h-300zM700 1100v100h300v-200h-99v-100h-100v100h99v100h-200zM801 200h100v200h-100v-200z" />
|
||||
<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 100v400h300v-500h-100v100h-200zM800 1100v100h200v-500h-100v400h-100zM901 200h100v200h-100v-200z" />
|
||||
<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 400v100h200v-500h-100v400h-100zM800 800v400h300v-500h-100v100h-200zM901 900h100v200h-100v-200z" />
|
||||
<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h500v-200h-500zM700 400v200h400v-200h-400zM700 700v200h300v-200h-300zM700 1000v200h200v-200h-200z" />
|
||||
<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h200v-200h-200zM700 400v200h300v-200h-300zM700 700v200h400v-200h-400zM700 1000v200h500v-200h-500z" />
|
||||
<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q162 0 281 -118.5t119 -281.5v-300q0 -165 -118.5 -282.5t-281.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500z" />
|
||||
<glyph unicode="" d="M0 400v300q0 163 119 281.5t281 118.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-163 0 -281.5 117.5t-118.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM400 300l333 250l-333 250v-500z" />
|
||||
<glyph unicode="" d="M0 400v300q0 163 117.5 281.5t282.5 118.5h300q163 0 281.5 -119t118.5 -281v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 700l250 -333l250 333h-500z" />
|
||||
<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -162 -118.5 -281t-281.5 -119h-300q-165 0 -282.5 118.5t-117.5 281.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 400h500l-250 333z" />
|
||||
<glyph unicode="" d="M0 400v300h300v200l400 -350l-400 -350v200h-300zM500 0v200h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-500v200h400q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-400z" />
|
||||
<glyph unicode="" d="M217 519q8 -19 31 -19h302q-155 -438 -160 -458q-5 -21 4 -32l9 -8h9q14 0 26 15q11 13 274.5 321.5t264.5 308.5q14 19 5 36q-8 17 -31 17l-301 -1q1 4 78 219.5t79 227.5q2 15 -5 27l-9 9h-9q-15 0 -25 -16q-4 -6 -98 -111.5t-228.5 -257t-209.5 -237.5q-16 -19 -6 -41 z" />
|
||||
<glyph unicode="" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q47 0 100 15v185h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h500v185q-14 4 -114 7.5t-193 5.5l-93 2q-165 0 -282.5 -117.5t-117.5 -282.5v-300zM600 400v300h300v200l400 -350l-400 -350v200h-300z " />
|
||||
<glyph unicode="" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q163 0 281.5 117.5t118.5 282.5v98l-78 73l-122 -123v-148q0 -41 -29.5 -70.5t-70.5 -29.5h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h156l118 122l-74 78h-100q-165 0 -282.5 -117.5t-117.5 -282.5 v-300zM496 709l353 342l-149 149h500v-500l-149 149l-342 -353z" />
|
||||
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM406 600 q0 80 57 137t137 57t137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137z" />
|
||||
<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 800l445 -500l450 500h-295v400h-300v-400h-300zM900 150h100v50h-100v-50z" />
|
||||
<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 700h300v-300h300v300h295l-445 500zM900 150h100v50h-100v-50z" />
|
||||
<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 705l305 -305l596 596l-154 155l-442 -442l-150 151zM900 150h100v50h-100v-50z" />
|
||||
<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 988l97 -98l212 213l-97 97zM200 400l697 1l3 699l-250 -239l-149 149l-212 -212l149 -149zM900 150h100v50h-100v-50z" />
|
||||
<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM200 612l212 -212l98 97l-213 212zM300 1200l239 -250l-149 -149l212 -212l149 148l249 -237l-1 697zM900 150h100v50h-100v-50z" />
|
||||
<glyph unicode="" d="M23 415l1177 784v-1079l-475 272l-310 -393v416h-392zM494 210l672 938l-672 -712v-226z" />
|
||||
<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-850q0 -21 -15 -35.5t-35 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200z" />
|
||||
<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-218l-276 -275l-120 120l-126 -127h-378v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM581 306l123 123l120 -120l353 352l123 -123l-475 -476zM600 1000h100v200h-100v-200z" />
|
||||
<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-269l-103 -103l-170 170l-298 -298h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200zM700 133l170 170l-170 170l127 127l170 -170l170 170l127 -128l-170 -169l170 -170 l-127 -127l-170 170l-170 -170z" />
|
||||
<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-300h-400v-200h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300l300 -300l300 300h-200v300h-200v-300h-200zM600 1000v200h100v-200h-100z" />
|
||||
<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-402l-200 200l-298 -298h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300h200v-300h200v300h200l-300 300zM600 1000v200h100v-200h-100z" />
|
||||
<glyph unicode="" d="M0 250q0 -21 14.5 -35.5t35.5 -14.5h1100q21 0 35.5 14.5t14.5 35.5v550h-1200v-550zM0 900h1200v150q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 300v200h400v-200h-400z" />
|
||||
<glyph unicode="" d="M0 400l300 298v-198h400v-200h-400v-198zM100 800v200h100v-200h-100zM300 800v200h100v-200h-100zM500 800v200h400v198l300 -298l-300 -298v198h-400zM800 300v200h100v-200h-100zM1000 300h100v200h-100v-200z" />
|
||||
<glyph unicode="" d="M100 700v400l50 100l50 -100v-300h100v300l50 100l50 -100v-300h100v300l50 100l50 -100v-400l-100 -203v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447zM800 597q0 -29 10.5 -55.5t25 -43t29 -28.5t25.5 -18l10 -5v-397q0 -21 14.5 -35.5 t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v1106q0 31 -18 40.5t-44 -7.5l-276 -116q-25 -17 -43.5 -51.5t-18.5 -65.5v-359z" />
|
||||
<glyph unicode="" d="M100 0h400v56q-75 0 -87.5 6t-12.5 44v394h500v-394q0 -38 -12.5 -44t-87.5 -6v-56h400v56q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v888q0 22 25 34.5t50 13.5l25 2v56h-400v-56q75 0 87.5 -6t12.5 -44v-394h-500v394q0 38 12.5 44t87.5 6v56h-400v-56q4 0 11 -0.5 t24 -3t30 -7t24 -15t11 -24.5v-888q0 -22 -25 -34.5t-50 -13.5l-25 -2v-56z" />
|
||||
<glyph unicode="" d="M0 300q0 -41 29.5 -70.5t70.5 -29.5h300q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-300q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM100 100h400l200 200h105l295 98v-298h-425l-100 -100h-375zM100 300v200h300v-200h-300zM100 600v200h300v-200h-300z M100 1000h400l200 -200v-98l295 98h105v200h-425l-100 100h-375zM700 402v163l400 133v-163z" />
|
||||
<glyph unicode="" d="M16.5 974.5q0.5 -21.5 16 -90t46.5 -140t104 -177.5t175 -208q103 -103 207.5 -176t180 -103.5t137 -47t92.5 -16.5l31 1l163 162q17 18 13.5 41t-22.5 37l-192 136q-19 14 -45 12t-42 -19l-118 -118q-142 101 -268 227t-227 268l118 118q17 17 20 41.5t-11 44.5 l-139 194q-14 19 -36.5 22t-40.5 -14l-162 -162q-1 -11 -0.5 -32.5z" />
|
||||
<glyph unicode="" d="M0 50v212q0 20 10.5 45.5t24.5 39.5l365 303v50q0 4 1 10.5t12 22.5t30 28.5t60 23t97 10.5t97 -10t60 -23.5t30 -27.5t12 -24l1 -10v-50l365 -303q14 -14 24.5 -39.5t10.5 -45.5v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-20 0 -35 14.5t-15 35.5zM0 712 q0 -21 14.5 -33.5t34.5 -8.5l202 33q20 4 34.5 21t14.5 38v146q141 24 300 24t300 -24v-146q0 -21 14.5 -38t34.5 -21l202 -33q20 -4 34.5 8.5t14.5 33.5v200q-6 8 -19 20.5t-63 45t-112 57t-171 45t-235 20.5q-92 0 -175 -10.5t-141.5 -27t-108.5 -36.5t-81.5 -40 t-53.5 -36.5t-31 -27.5l-9 -10v-200z" />
|
||||
<glyph unicode="" d="M100 0v100h1100v-100h-1100zM175 200h950l-125 150v250l100 100v400h-100v-200h-100v200h-200v-200h-100v200h-200v-200h-100v200h-100v-400l100 -100v-250z" />
|
||||
<glyph unicode="" d="M100 0h300v400q0 41 -29.5 70.5t-70.5 29.5h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-400zM500 0v1000q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-1000h-300zM900 0v700q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-700h-300z" />
|
||||
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
|
||||
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h100v200h100v-200h100v500h-100v-200h-100v200h-100v-500zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
|
||||
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v100h-200v300h200v100h-300v-500zM600 300h300v100h-200v300h200v100h-300v-500z" />
|
||||
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 550l300 -150v300zM600 400l300 150l-300 150v-300z" />
|
||||
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300v500h700v-500h-700zM300 400h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130v-300zM575 549 q0 -65 27 -107t68 -42h130v300h-130q-38 0 -66.5 -43t-28.5 -108z" />
|
||||
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
|
||||
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v400h-200v100h-100v-500zM301 400v200h100v-200h-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
|
||||
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 700v100h300v-300h-99v-100h-100v100h99v200h-200zM201 300v100h100v-100h-100zM601 300v100h100v-100h-100z M700 700v100h200v-500h-100v400h-100z" />
|
||||
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 500v200 l100 100h300v-100h-300v-200h300v-100h-300z" />
|
||||
<glyph unicode="" d="M0 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 400v400h300 l100 -100v-100h-100v100h-200v-100h200v-100h-200v-100h-100zM700 400v100h100v-100h-100z" />
|
||||
<glyph unicode="" d="M-14 494q0 -80 56.5 -137t135.5 -57h222v300h400v-300h128q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200h200v300h200v-300h200 l-300 -300z" />
|
||||
<glyph unicode="" d="M-14 494q0 -80 56.5 -137t135.5 -57h8l414 414l403 -403q94 26 154.5 104.5t60.5 178.5q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200l300 300 l300 -300h-200v-300h-200v300h-200z" />
|
||||
<glyph unicode="" d="M100 200h400v-155l-75 -45h350l-75 45v155h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170z" />
|
||||
<glyph unicode="" d="M121 700q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350l-75 45v306q46 -30 100 -30q74 0 126.5 52.5t52.5 126.5q0 24 -9 55q50 32 79.5 83t29.5 112q0 90 -61.5 155.5t-150.5 71.5q-26 89 -99.5 145.5 t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -11.5t1 -11.5q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5z" />
|
||||
</font>
|
||||
</defs></svg>
|
||||
|
After Width: | Height: | Size: 62 KiB |
BIN
lib/borealis/library/lib/extern/fmt/doc/_static/fonts/glyphicons-halflings-regular.ttf
vendored
Normal file
BIN
lib/borealis/library/lib/extern/fmt/doc/_static/fonts/glyphicons-halflings-regular.ttf
vendored
Normal file
Binary file not shown.
BIN
lib/borealis/library/lib/extern/fmt/doc/_static/fonts/glyphicons-halflings-regular.woff
vendored
Normal file
BIN
lib/borealis/library/lib/extern/fmt/doc/_static/fonts/glyphicons-halflings-regular.woff
vendored
Normal file
Binary file not shown.
148
lib/borealis/library/lib/extern/fmt/doc/_templates/layout.html
vendored
Normal file
148
lib/borealis/library/lib/extern/fmt/doc/_templates/layout.html
vendored
Normal file
@@ -0,0 +1,148 @@
|
||||
{% extends "!layout.html" %}
|
||||
|
||||
{% block extrahead %}
|
||||
<meta name="description" content="Small, safe and fast formatting library">
|
||||
<meta name="keywords" content="C++, formatting, printf, string, library">
|
||||
<meta name="author" content="Victor Zverovich">
|
||||
<link rel="stylesheet" href="_static/fmt.css">
|
||||
{# Google Analytics #}
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-20116650-4"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag(){dataLayer.push(arguments);}
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'UA-20116650-4');
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
{%- macro searchform(classes, button) %}
|
||||
<form class="{{classes}}" role="search" action="{{ pathto('search') }}"
|
||||
method="get">
|
||||
<div class="form-group">
|
||||
<input type="text" name="q" class="form-control"
|
||||
{{ 'placeholder="Search"' if not button }} >
|
||||
</div>
|
||||
<input type="hidden" name="check_keywords" value="yes" />
|
||||
<input type="hidden" name="area" value="default" />
|
||||
{% if button %}
|
||||
<input type="submit" class="btn btn-default" value="search">
|
||||
{% endif %}
|
||||
</form>
|
||||
{%- endmacro %}
|
||||
|
||||
{% block header %}
|
||||
<nav class="navbar navbar-inverse">
|
||||
<div class="tb-container">
|
||||
<div class="row">
|
||||
<div class="navbar-content">
|
||||
{# Brand and toggle get grouped for better mobile display #}
|
||||
<div class="navbar-header">
|
||||
<button type="button" class="navbar-toggle collapsed"
|
||||
data-toggle="collapse" data-target=".navbar-collapse">
|
||||
<span class="sr-only">Toggle navigation</span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
</button>
|
||||
<a class="navbar-brand" href="index.html">{fmt}</a>
|
||||
</div>
|
||||
|
||||
{# Collect the nav links, forms, and other content for toggling #}
|
||||
<div class="collapse navbar-collapse">
|
||||
<ul class="nav navbar-nav">
|
||||
<li class="dropdown">
|
||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown"
|
||||
role="button" aria-expanded="false">{{ version }}
|
||||
<span class="caret"></span></a>
|
||||
<ul class="dropdown-menu" role="menu">
|
||||
{% for v in versions.split(',') %}
|
||||
<li><a href="https://fmt.dev/{{v}}">{{v}}</a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</li>
|
||||
{% for name in ['Contents', 'Usage', 'API', 'Syntax'] %}
|
||||
{% if pagename == name.lower() %}
|
||||
<li class="active"><a href="{{name.lower()}}.html">{{name}}
|
||||
<span class="sr-only">(current)</span></a></li>
|
||||
{%else%}
|
||||
<li><a href="{{name.lower()}}.html">{{name}}</a></li>
|
||||
{%endif%}
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% if pagename != 'search' %}
|
||||
{{ searchform('navbar-form navbar-right', False) }}
|
||||
{%endif%}
|
||||
</div> {# /.navbar-collapse #}
|
||||
</div> {# /.col-md-offset-2 #}
|
||||
</div> {# /.row #}
|
||||
</div> {# /.tb-container #}
|
||||
</nav>
|
||||
{% if pagename == "index" %}
|
||||
{% set download_url = 'https://github.com/fmtlib/fmt/releases/download' %}
|
||||
<div class="jumbotron">
|
||||
<div class="tb-container">
|
||||
<h1>{fmt}</h1>
|
||||
<p class="lead">A modern formatting library</p>
|
||||
<div class="btn-group" role="group">
|
||||
{% set name = 'fmt' if version.split('.')[0]|int >= 3 else 'cppformat' %}
|
||||
<a class="btn btn-success"
|
||||
href="{{download_url}}/{{version}}/{{name}}-{{version}}.zip">
|
||||
<span class="glyphicon glyphicon-download"></span> Download
|
||||
</a>
|
||||
<button type="button" class="btn btn-success dropdown-toggle"
|
||||
data-toggle="dropdown"><span class="caret"></span></button>
|
||||
<ul class="dropdown-menu">
|
||||
{% for v in versions.split(',') %}
|
||||
{% set name = 'fmt' if v.split('.')[0]|int >= 3 else 'cppformat' %}
|
||||
<li><a href="{{download_url}}/{{v}}/{{name}}-{{v}}.zip">Version {{v}}
|
||||
</a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
|
||||
{# Disable relbars. #}
|
||||
{% block relbar1 %}
|
||||
{% endblock %}
|
||||
{% block relbar2 %}
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="tb-container">
|
||||
<div class="row">
|
||||
{# Sidebar is currently disabled.
|
||||
<div class="bs-sidebar">
|
||||
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
|
||||
<div class="sphinxsidebarwrapper">
|
||||
{%- block sidebarlogo %}
|
||||
{%- if logo %}
|
||||
<p class="logo"><a href="{{ pathto(master_doc) }}">
|
||||
<img class="logo" src="{{ pathto('_static/' + logo, 1) }}"
|
||||
alt="Logo"/>
|
||||
</a></p>
|
||||
{%- endif %}
|
||||
{%- endblock %}
|
||||
{%- for sidebartemplate in sidebars %}
|
||||
{%- include sidebartemplate %}
|
||||
{%- endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
#}
|
||||
|
||||
<div class="content">
|
||||
{% block body %} {% endblock %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% block footer %}
|
||||
{{ super() }}
|
||||
{# Placed at the end of the document so the pages load faster. #}
|
||||
<script src="_static/bootstrap.min.js"></script>
|
||||
{% endblock %}
|
||||
55
lib/borealis/library/lib/extern/fmt/doc/_templates/search.html
vendored
Normal file
55
lib/borealis/library/lib/extern/fmt/doc/_templates/search.html
vendored
Normal file
@@ -0,0 +1,55 @@
|
||||
{#
|
||||
basic/search.html
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
Template for the search page.
|
||||
|
||||
:copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS.
|
||||
:license: BSD, see LICENSE for details.
|
||||
#}
|
||||
{%- extends "layout.html" %}
|
||||
{% set title = _('Search') %}
|
||||
{% set script_files = script_files + ['_static/searchtools.js'] %}
|
||||
{% block extrahead %}
|
||||
<script type="text/javascript">
|
||||
jQuery(function() { Search.loadIndex("{{ pathto('searchindex.js', 1) }}"); });
|
||||
</script>
|
||||
{# this is used when loading the search index using $.ajax fails,
|
||||
such as on Chrome for documents on localhost #}
|
||||
<script type="text/javascript" id="searchindexloader"></script>
|
||||
{{ super() }}
|
||||
{% endblock %}
|
||||
{% block body %}
|
||||
<h1 id="search-documentation">{{ _('Search') }}</h1>
|
||||
<div id="fallback" class="admonition warning">
|
||||
<script type="text/javascript">$('#fallback').hide();</script>
|
||||
<p>
|
||||
{% trans %}Please activate JavaScript to enable the search
|
||||
functionality.{% endtrans %}
|
||||
</p>
|
||||
</div>
|
||||
<p>
|
||||
{% trans %}From here you can search these documents. Enter your search
|
||||
words into the box below and click "search". Note that the search
|
||||
function will automatically search for all of the words. Pages
|
||||
containing fewer words won't appear in the result list.{% endtrans %}
|
||||
</p>
|
||||
{{ searchform('form-inline', True) }}
|
||||
{% if search_performed %}
|
||||
<h2>{{ _('Search Results') }}</h2>
|
||||
{% if not search_results %}
|
||||
<p>{{ _('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.') }}</p>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
<div id="search-results">
|
||||
{% if search_results %}
|
||||
<ul>
|
||||
{% for href, caption, context in search_results %}
|
||||
<li><a href="{{ pathto(item.href) }}">{{ caption }}</a>
|
||||
<div class="context">{{ context|e }}</div>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
455
lib/borealis/library/lib/extern/fmt/doc/api.rst
vendored
Normal file
455
lib/borealis/library/lib/extern/fmt/doc/api.rst
vendored
Normal file
@@ -0,0 +1,455 @@
|
||||
.. _string-formatting-api:
|
||||
|
||||
*************
|
||||
API Reference
|
||||
*************
|
||||
|
||||
The {fmt} library API consists of the following parts:
|
||||
|
||||
* :ref:`fmt/core.h <core-api>`: the core API providing argument handling
|
||||
facilities and a lightweight subset of formatting functions
|
||||
* :ref:`fmt/format.h <format-api>`: the full format API providing compile-time
|
||||
format string checks, wide string, output iterator and user-defined type
|
||||
support
|
||||
* :ref:`fmt/ranges.h <ranges-api>`: additional formatting support for ranges
|
||||
and tuples
|
||||
* :ref:`fmt/chrono.h <chrono-api>`: date and time formatting
|
||||
* :ref:`fmt/compile.h <compile-api>`: format string compilation
|
||||
* :ref:`fmt/ostream.h <ostream-api>`: ``std::ostream`` support
|
||||
* :ref:`fmt/printf.h <printf-api>`: ``printf`` formatting
|
||||
|
||||
All functions and types provided by the library reside in namespace ``fmt`` and
|
||||
macros have prefix ``FMT_``.
|
||||
|
||||
.. _core-api:
|
||||
|
||||
Core API
|
||||
========
|
||||
|
||||
``fmt/core.h`` defines the core API which provides argument handling facilities
|
||||
and a lightweight subset of formatting functions. In the header-only mode
|
||||
include ``fmt/format.h`` instead of ``fmt/core.h``.
|
||||
|
||||
The following functions use :ref:`format string syntax <syntax>`
|
||||
similar to that of Python's `str.format
|
||||
<http://docs.python.org/3/library/stdtypes.html#str.format>`_.
|
||||
They take *format_str* and *args* as arguments.
|
||||
|
||||
*format_str* is a format string that contains literal text and replacement
|
||||
fields surrounded by braces ``{}``. The fields are replaced with formatted
|
||||
arguments in the resulting string. A function taking *format_str* doesn't
|
||||
participate in an overload resolution if the latter is not a string.
|
||||
|
||||
*args* is an argument list representing objects to be formatted.
|
||||
|
||||
.. _format:
|
||||
|
||||
.. doxygenfunction:: format(const S&, Args&&...)
|
||||
.. doxygenfunction:: vformat(const S&, basic_format_args<buffer_context<type_identity_t<Char>>>)
|
||||
|
||||
.. _print:
|
||||
|
||||
.. doxygenfunction:: print(const S&, Args&&...)
|
||||
.. doxygenfunction:: vprint(string_view, format_args)
|
||||
|
||||
.. doxygenfunction:: print(std::FILE *, const S&, Args&&...)
|
||||
.. doxygenfunction:: vprint(std::FILE *, string_view, format_args)
|
||||
|
||||
Named Arguments
|
||||
---------------
|
||||
|
||||
.. doxygenfunction:: fmt::arg(const S&, const T&)
|
||||
|
||||
Named arguments are not supported in compile-time checks at the moment.
|
||||
|
||||
Argument Lists
|
||||
--------------
|
||||
|
||||
.. doxygenfunction:: fmt::make_format_args(const Args&...)
|
||||
|
||||
.. doxygenclass:: fmt::format_arg_store
|
||||
:members:
|
||||
|
||||
.. doxygenclass:: fmt::dynamic_format_arg_store
|
||||
:members:
|
||||
|
||||
.. doxygenclass:: fmt::basic_format_args
|
||||
:members:
|
||||
|
||||
.. doxygenstruct:: fmt::format_args
|
||||
|
||||
.. doxygenclass:: fmt::basic_format_arg
|
||||
:members:
|
||||
|
||||
Compatibility
|
||||
-------------
|
||||
|
||||
.. doxygenclass:: fmt::basic_string_view
|
||||
:members:
|
||||
|
||||
.. doxygentypedef:: fmt::string_view
|
||||
.. doxygentypedef:: fmt::wstring_view
|
||||
|
||||
Locale
|
||||
------
|
||||
|
||||
All formatting is locale-independent by default. Use the ``'n'`` format
|
||||
specifier to insert the appropriate number separator characters from the
|
||||
locale::
|
||||
|
||||
#include <fmt/core.h>
|
||||
#include <locale>
|
||||
|
||||
std::locale::global(std::locale("en_US.UTF-8"));
|
||||
auto s = fmt::format("{:L}", 1000000); // s == "1,000,000"
|
||||
|
||||
.. _format-api:
|
||||
|
||||
Format API
|
||||
==========
|
||||
|
||||
``fmt/format.h`` defines the full format API providing compile-time format
|
||||
string checks, wide string, output iterator and user-defined type support.
|
||||
|
||||
Compile-time Format String Checks
|
||||
---------------------------------
|
||||
|
||||
Compile-time checks are supported for built-in and string types as well as
|
||||
user-defined types with ``constexpr`` ``parse`` functions in their ``formatter``
|
||||
specializations.
|
||||
|
||||
.. doxygendefine:: FMT_STRING
|
||||
|
||||
Formatting User-defined Types
|
||||
-----------------------------
|
||||
|
||||
To make a user-defined type formattable, specialize the ``formatter<T>`` struct
|
||||
template and implement ``parse`` and ``format`` methods::
|
||||
|
||||
#include <fmt/format.h>
|
||||
|
||||
struct point { double x, y; };
|
||||
|
||||
template <>
|
||||
struct fmt::formatter<point> {
|
||||
// Presentation format: 'f' - fixed, 'e' - exponential.
|
||||
char presentation = 'f';
|
||||
|
||||
// Parses format specifications of the form ['f' | 'e'].
|
||||
constexpr auto parse(format_parse_context& ctx) {
|
||||
// auto parse(format_parse_context &ctx) -> decltype(ctx.begin()) // c++11
|
||||
// [ctx.begin(), ctx.end()) is a character range that contains a part of
|
||||
// the format string starting from the format specifications to be parsed,
|
||||
// e.g. in
|
||||
//
|
||||
// fmt::format("{:f} - point of interest", point{1, 2});
|
||||
//
|
||||
// the range will contain "f} - point of interest". The formatter should
|
||||
// parse specifiers until '}' or the end of the range. In this example
|
||||
// the formatter should parse the 'f' specifier and return an iterator
|
||||
// pointing to '}'.
|
||||
|
||||
// Parse the presentation format and store it in the formatter:
|
||||
auto it = ctx.begin(), end = ctx.end();
|
||||
if (it != end && (*it == 'f' || *it == 'e')) presentation = *it++;
|
||||
|
||||
// Check if reached the end of the range:
|
||||
if (it != end && *it != '}')
|
||||
throw format_error("invalid format");
|
||||
|
||||
// Return an iterator past the end of the parsed range:
|
||||
return it;
|
||||
}
|
||||
|
||||
// Formats the point p using the parsed format specification (presentation)
|
||||
// stored in this formatter.
|
||||
template <typename FormatContext>
|
||||
auto format(const point& p, FormatContext& ctx) {
|
||||
// auto format(const point &p, FormatContext &ctx) -> decltype(ctx.out()) // c++11
|
||||
// ctx.out() is an output iterator to write to.
|
||||
return format_to(
|
||||
ctx.out(),
|
||||
presentation == 'f' ? "({:.1f}, {:.1f})" : "({:.1e}, {:.1e})",
|
||||
p.x, p.y);
|
||||
}
|
||||
};
|
||||
|
||||
Then you can pass objects of type ``point`` to any formatting function::
|
||||
|
||||
point p = {1, 2};
|
||||
std::string s = fmt::format("{:f}", p);
|
||||
// s == "(1.0, 2.0)"
|
||||
|
||||
You can also reuse existing formatters via inheritance or composition, for
|
||||
example::
|
||||
|
||||
enum class color {red, green, blue};
|
||||
|
||||
template <> struct fmt::formatter<color>: formatter<string_view> {
|
||||
// parse is inherited from formatter<string_view>.
|
||||
template <typename FormatContext>
|
||||
auto format(color c, FormatContext& ctx) {
|
||||
string_view name = "unknown";
|
||||
switch (c) {
|
||||
case color::red: name = "red"; break;
|
||||
case color::green: name = "green"; break;
|
||||
case color::blue: name = "blue"; break;
|
||||
}
|
||||
return formatter<string_view>::format(name, ctx);
|
||||
}
|
||||
};
|
||||
|
||||
Since ``parse`` is inherited from ``formatter<string_view>`` it will recognize
|
||||
all string format specifications, for example
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
fmt::format("{:>10}", color::blue)
|
||||
|
||||
will return ``" blue"``.
|
||||
|
||||
You can also write a formatter for a hierarchy of classes::
|
||||
|
||||
#include <type_traits>
|
||||
#include <fmt/format.h>
|
||||
|
||||
struct A {
|
||||
virtual ~A() {}
|
||||
virtual std::string name() const { return "A"; }
|
||||
};
|
||||
|
||||
struct B : A {
|
||||
virtual std::string name() const { return "B"; }
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct fmt::formatter<T, std::enable_if_t<std::is_base_of<A, T>::value, char>> :
|
||||
fmt::formatter<std::string> {
|
||||
template <typename FormatCtx>
|
||||
auto format(const A& a, FormatCtx& ctx) {
|
||||
return fmt::formatter<std::string>::format(a.name(), ctx);
|
||||
}
|
||||
};
|
||||
|
||||
int main() {
|
||||
B b;
|
||||
A& a = b;
|
||||
fmt::print("{}", a); // prints "B"
|
||||
}
|
||||
|
||||
.. doxygenclass:: fmt::basic_format_parse_context
|
||||
:members:
|
||||
|
||||
Output Iterator Support
|
||||
-----------------------
|
||||
|
||||
.. doxygenfunction:: fmt::format_to(OutputIt, const S&, Args&&...)
|
||||
.. doxygenfunction:: fmt::format_to_n(OutputIt, size_t, const S&, const Args&...)
|
||||
.. doxygenstruct:: fmt::format_to_n_result
|
||||
:members:
|
||||
|
||||
Literal-based API
|
||||
-----------------
|
||||
|
||||
The following user-defined literals are defined in ``fmt/format.h``.
|
||||
|
||||
.. doxygenfunction:: operator""_format(const char *, size_t)
|
||||
|
||||
.. doxygenfunction:: operator""_a(const char *, size_t)
|
||||
|
||||
Utilities
|
||||
---------
|
||||
|
||||
.. doxygenstruct:: fmt::is_char
|
||||
|
||||
.. doxygentypedef:: fmt::char_t
|
||||
|
||||
.. doxygenfunction:: fmt::formatted_size(string_view, const Args&...)
|
||||
|
||||
.. doxygenfunction:: fmt::to_string(const T&)
|
||||
|
||||
.. doxygenfunction:: fmt::to_wstring(const T&)
|
||||
|
||||
.. doxygenfunction:: fmt::to_string_view(const Char *)
|
||||
|
||||
.. doxygenfunction:: fmt::join(const Range&, string_view)
|
||||
|
||||
.. doxygenfunction:: fmt::join(It, Sentinel, string_view)
|
||||
|
||||
.. doxygenclass:: fmt::detail::buffer
|
||||
:members:
|
||||
|
||||
.. doxygenclass:: fmt::basic_memory_buffer
|
||||
:protected-members:
|
||||
:members:
|
||||
|
||||
System Errors
|
||||
-------------
|
||||
|
||||
fmt does not use ``errno`` to communicate errors to the user, but it may call
|
||||
system functions which set ``errno``. Users should not make any assumptions about
|
||||
the value of ``errno`` being preserved by library functions.
|
||||
|
||||
.. doxygenclass:: fmt::system_error
|
||||
:members:
|
||||
|
||||
.. doxygenfunction:: fmt::format_system_error
|
||||
|
||||
.. doxygenclass:: fmt::windows_error
|
||||
:members:
|
||||
|
||||
.. _formatstrings:
|
||||
|
||||
Custom Allocators
|
||||
-----------------
|
||||
|
||||
The {fmt} library supports custom dynamic memory allocators.
|
||||
A custom allocator class can be specified as a template argument to
|
||||
:class:`fmt::basic_memory_buffer`::
|
||||
|
||||
using custom_memory_buffer =
|
||||
fmt::basic_memory_buffer<char, fmt::inline_buffer_size, custom_allocator>;
|
||||
|
||||
It is also possible to write a formatting function that uses a custom
|
||||
allocator::
|
||||
|
||||
using custom_string =
|
||||
std::basic_string<char, std::char_traits<char>, custom_allocator>;
|
||||
|
||||
custom_string vformat(custom_allocator alloc, fmt::string_view format_str,
|
||||
fmt::format_args args) {
|
||||
custom_memory_buffer buf(alloc);
|
||||
fmt::vformat_to(buf, format_str, args);
|
||||
return custom_string(buf.data(), buf.size(), alloc);
|
||||
}
|
||||
|
||||
template <typename ...Args>
|
||||
inline custom_string format(custom_allocator alloc,
|
||||
fmt::string_view format_str,
|
||||
const Args& ... args) {
|
||||
return vformat(alloc, format_str, fmt::make_format_args(args...));
|
||||
}
|
||||
|
||||
The allocator will be used for the output container only. If you are using named
|
||||
arguments, the container that stores pointers to them will be allocated using
|
||||
the default allocator. Also floating-point formatting falls back on ``sprintf``
|
||||
which may do allocations.
|
||||
|
||||
.. _ranges-api:
|
||||
|
||||
Ranges and Tuple Formatting
|
||||
===========================
|
||||
|
||||
The library also supports convenient formatting of ranges and tuples::
|
||||
|
||||
#include <fmt/ranges.h>
|
||||
|
||||
std::tuple<char, int, float> t{'a', 1, 2.0f};
|
||||
// Prints "('a', 1, 2.0)"
|
||||
fmt::print("{}", t);
|
||||
|
||||
|
||||
NOTE: currently, the overload of ``fmt::join`` for iterables exists in the main
|
||||
``format.h`` header, but expect this to change in the future.
|
||||
|
||||
Using ``fmt::join``, you can separate tuple elements with a custom separator::
|
||||
|
||||
#include <fmt/ranges.h>
|
||||
|
||||
std::tuple<int, char> t = {1, 'a'};
|
||||
// Prints "1, a"
|
||||
fmt::print("{}", fmt::join(t, ", "));
|
||||
|
||||
.. _chrono-api:
|
||||
|
||||
Date and Time Formatting
|
||||
========================
|
||||
|
||||
The library supports `strftime
|
||||
<http://en.cppreference.com/w/cpp/chrono/c/strftime>`_-like date and time
|
||||
formatting::
|
||||
|
||||
#include <fmt/chrono.h>
|
||||
|
||||
std::time_t t = std::time(nullptr);
|
||||
// Prints "The date is 2016-04-29." (with the current date)
|
||||
fmt::print("The date is {:%Y-%m-%d}.", fmt::localtime(t));
|
||||
|
||||
The format string syntax is described in the documentation of
|
||||
`strftime <http://en.cppreference.com/w/cpp/chrono/c/strftime>`_.
|
||||
|
||||
.. _compile-api:
|
||||
|
||||
Format string compilation
|
||||
=========================
|
||||
|
||||
``fmt/compile.h`` provides format string compilation support. Format strings
|
||||
are parsed at compile time and converted into efficient formatting code. This
|
||||
supports arguments of built-in and string types as well as user-defined types
|
||||
with ``constexpr`` ``parse`` functions in their ``formatter`` specializations.
|
||||
Format string compilation can generate more binary code compared to the default
|
||||
API and is only recommended in places where formatting is a performance
|
||||
bottleneck.
|
||||
|
||||
.. doxygendefine:: FMT_COMPILE
|
||||
|
||||
.. _ostream-api:
|
||||
|
||||
``std::ostream`` Support
|
||||
========================
|
||||
|
||||
``fmt/ostream.h`` provides ``std::ostream`` support including formatting of
|
||||
user-defined types that have overloaded ``operator<<``::
|
||||
|
||||
#include <fmt/ostream.h>
|
||||
|
||||
class date {
|
||||
int year_, month_, day_;
|
||||
public:
|
||||
date(int year, int month, int day): year_(year), month_(month), day_(day) {}
|
||||
|
||||
friend std::ostream& operator<<(std::ostream& os, const date& d) {
|
||||
return os << d.year_ << '-' << d.month_ << '-' << d.day_;
|
||||
}
|
||||
};
|
||||
|
||||
std::string s = fmt::format("The date is {}", date(2012, 12, 9));
|
||||
// s == "The date is 2012-12-9"
|
||||
|
||||
.. doxygenfunction:: print(std::basic_ostream<Char>&, const S&, Args&&...)
|
||||
|
||||
.. _printf-api:
|
||||
|
||||
``printf`` Formatting
|
||||
=====================
|
||||
|
||||
The header ``fmt/printf.h`` provides ``printf``-like formatting functionality.
|
||||
The following functions use `printf format string syntax
|
||||
<http://pubs.opengroup.org/onlinepubs/009695399/functions/fprintf.html>`_ with
|
||||
the POSIX extension for positional arguments. Unlike their standard
|
||||
counterparts, the ``fmt`` functions are type-safe and throw an exception if an
|
||||
argument type doesn't match its format specification.
|
||||
|
||||
.. doxygenfunction:: printf(const S&, const Args&...)
|
||||
|
||||
.. doxygenfunction:: fprintf(std::FILE *, const S&, const Args&...)
|
||||
|
||||
.. doxygenfunction:: fprintf(std::basic_ostream<Char>&, const S&, const Args&...)
|
||||
|
||||
.. doxygenfunction:: sprintf(const S&, const Args&...)
|
||||
|
||||
Compatibility with C++20 ``std::format``
|
||||
========================================
|
||||
|
||||
{fmt} implements nearly all of the `C++20 formatting library
|
||||
<https://en.cppreference.com/w/cpp/utility/format>`_ with the following
|
||||
differences:
|
||||
|
||||
* Names are defined in the ``fmt`` namespace instead of ``std`` to avoid
|
||||
collisions with standard library implementations.
|
||||
* The ``'L'`` format specifier cannot be combined with presentation specifiers
|
||||
yet.
|
||||
* Width calculation doesn't use grapheme clusterization. The latter has been
|
||||
implemented in a separate branch but hasn't been integrated yet.
|
||||
* Chrono formatting doesn't support C++20 date types since they are not provided
|
||||
by standard library implementations.
|
||||
2
lib/borealis/library/lib/extern/fmt/doc/basic-bootstrap/README
vendored
Normal file
2
lib/borealis/library/lib/extern/fmt/doc/basic-bootstrap/README
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
Sphinx basic theme with Bootstrap support. Modifications are kept to
|
||||
a minimum to simplify integration in case of changes to Sphinx theming.
|
||||
206
lib/borealis/library/lib/extern/fmt/doc/basic-bootstrap/layout.html
vendored
Normal file
206
lib/borealis/library/lib/extern/fmt/doc/basic-bootstrap/layout.html
vendored
Normal file
@@ -0,0 +1,206 @@
|
||||
{#
|
||||
basic/layout.html
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
Master layout template for Sphinx themes.
|
||||
|
||||
:copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS.
|
||||
:license: BSD, see LICENSE for details.
|
||||
#}
|
||||
{%- block doctype -%}
|
||||
<!DOCTYPE html>
|
||||
{%- endblock %}
|
||||
{%- set reldelim1 = reldelim1 is not defined and ' »' or reldelim1 %}
|
||||
{%- set reldelim2 = reldelim2 is not defined and ' |' or reldelim2 %}
|
||||
{%- set render_sidebar = (not embedded) and (not theme_nosidebar|tobool) and
|
||||
(sidebars != []) %}
|
||||
{%- set url_root = pathto('', 1) %}
|
||||
{# XXX necessary? #}
|
||||
{%- if url_root == '#' %}{% set url_root = '' %}{% endif %}
|
||||
{%- if not embedded and docstitle %}
|
||||
{%- set titlesuffix = " — "|safe + docstitle|e %}
|
||||
{%- else %}
|
||||
{%- set titlesuffix = "" %}
|
||||
{%- endif %}
|
||||
|
||||
{%- macro relbar() %}
|
||||
<div class="related" role="navigation" aria-label="related navigation">
|
||||
<h3>{{ _('Navigation') }}</h3>
|
||||
<ul>
|
||||
{%- for rellink in rellinks %}
|
||||
<li class="right" {% if loop.first %}style="margin-right: 10px"{% endif %}>
|
||||
<a href="{{ pathto(rellink[0]) }}" title="{{ rellink[1]|striptags|e }}"
|
||||
{{ accesskey(rellink[2]) }}>{{ rellink[3] }}</a>
|
||||
{%- if not loop.first %}{{ reldelim2 }}{% endif %}</li>
|
||||
{%- endfor %}
|
||||
{%- block rootrellink %}
|
||||
<li class="nav-item nav-item-0"><a href="{{ pathto(master_doc) }}">{{ shorttitle|e }}</a>{{ reldelim1 }}</li>
|
||||
{%- endblock %}
|
||||
{%- for parent in parents %}
|
||||
<li class="nav-item nav-item-{{ loop.index }}"><a href="{{ parent.link|e }}" {% if loop.last %}{{ accesskey("U") }}{% endif %}>{{ parent.title }}</a>{{ reldelim1 }}</li>
|
||||
{%- endfor %}
|
||||
{%- block relbaritems %} {% endblock %}
|
||||
</ul>
|
||||
</div>
|
||||
{%- endmacro %}
|
||||
|
||||
{%- macro sidebar() %}
|
||||
{%- if render_sidebar %}
|
||||
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
|
||||
<div class="sphinxsidebarwrapper">
|
||||
{%- block sidebarlogo %}
|
||||
{%- if logo %}
|
||||
<p class="logo"><a href="{{ pathto(master_doc) }}">
|
||||
<img class="logo" src="{{ pathto('_static/' + logo, 1) }}" alt="Logo"/>
|
||||
</a></p>
|
||||
{%- endif %}
|
||||
{%- endblock %}
|
||||
{%- if sidebars != None %}
|
||||
{#- new style sidebar: explicitly include/exclude templates #}
|
||||
{%- for sidebartemplate in sidebars %}
|
||||
{%- include sidebartemplate %}
|
||||
{%- endfor %}
|
||||
{%- else %}
|
||||
{#- old style sidebars: using blocks -- should be deprecated #}
|
||||
{%- block sidebartoc %}
|
||||
{%- include "localtoc.html" %}
|
||||
{%- endblock %}
|
||||
{%- block sidebarrel %}
|
||||
{%- include "relations.html" %}
|
||||
{%- endblock %}
|
||||
{%- block sidebarsourcelink %}
|
||||
{%- include "sourcelink.html" %}
|
||||
{%- endblock %}
|
||||
{%- if customsidebar %}
|
||||
{%- include customsidebar %}
|
||||
{%- endif %}
|
||||
{%- block sidebarsearch %}
|
||||
{%- include "searchbox.html" %}
|
||||
{%- endblock %}
|
||||
{%- endif %}
|
||||
</div>
|
||||
</div>
|
||||
{%- endif %}
|
||||
{%- endmacro %}
|
||||
|
||||
{%- macro script() %}
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: '{{ url_root }}',
|
||||
VERSION: '{{ release|e }}',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '{{ '' if no_search_suffix else file_suffix }}',
|
||||
HAS_SOURCE: {{ has_source|lower }},
|
||||
SOURCELINK_SUFFIX: '{{ sourcelink_suffix }}'
|
||||
};
|
||||
</script>
|
||||
{%- for scriptfile in script_files %}
|
||||
<script type="text/javascript" src="{{ pathto(scriptfile, 1) }}"></script>
|
||||
{%- endfor %}
|
||||
{%- endmacro %}
|
||||
|
||||
{%- macro css() %}
|
||||
<link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" />
|
||||
<link rel="stylesheet" href="{{ pathto('_static/pygments.css', 1) }}" type="text/css" />
|
||||
{%- for cssfile in css_files %}
|
||||
<link rel="stylesheet" href="{{ pathto(cssfile, 1) }}" type="text/css" />
|
||||
{%- endfor %}
|
||||
{%- endmacro %}
|
||||
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="{{ encoding }}">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
{# The above 3 meta tags *must* come first in the head; any other head content
|
||||
must come *after* these tags. #}
|
||||
{{ metatags }}
|
||||
{%- block htmltitle %}
|
||||
<title>{{ title|striptags|e }}{{ titlesuffix }}</title>
|
||||
{%- endblock %}
|
||||
{{ css() }}
|
||||
{%- if not embedded %}
|
||||
{{ script() }}
|
||||
{%- if use_opensearch %}
|
||||
<link rel="search" type="application/opensearchdescription+xml"
|
||||
title="{% trans docstitle=docstitle|e %}Search within {{ docstitle }}{% endtrans %}"
|
||||
href="{{ pathto('_static/opensearch.xml', 1) }}"/>
|
||||
{%- endif %}
|
||||
{%- if favicon %}
|
||||
<link rel="shortcut icon" href="{{ pathto('_static/' + favicon, 1) }}"/>
|
||||
{%- endif %}
|
||||
{%- endif %}
|
||||
{%- block linktags %}
|
||||
{%- if hasdoc('about') %}
|
||||
<link rel="author" title="{{ _('About these documents') }}" href="{{ pathto('about') }}" />
|
||||
{%- endif %}
|
||||
{%- if hasdoc('genindex') %}
|
||||
<link rel="index" title="{{ _('Index') }}" href="{{ pathto('genindex') }}" />
|
||||
{%- endif %}
|
||||
{%- if hasdoc('search') %}
|
||||
<link rel="search" title="{{ _('Search') }}" href="{{ pathto('search') }}" />
|
||||
{%- endif %}
|
||||
{%- if hasdoc('copyright') %}
|
||||
<link rel="copyright" title="{{ _('Copyright') }}" href="{{ pathto('copyright') }}" />
|
||||
{%- endif %}
|
||||
{%- if parents %}
|
||||
<link rel="up" title="{{ parents[-1].title|striptags|e }}" href="{{ parents[-1].link|e }}" />
|
||||
{%- endif %}
|
||||
{%- if next %}
|
||||
<link rel="next" title="{{ next.title|striptags|e }}" href="{{ next.link|e }}" />
|
||||
{%- endif %}
|
||||
{%- if prev %}
|
||||
<link rel="prev" title="{{ prev.title|striptags|e }}" href="{{ prev.link|e }}" />
|
||||
{%- endif %}
|
||||
{%- endblock %}
|
||||
{%- block extrahead %} {% endblock %}
|
||||
</head>
|
||||
<body role="document">
|
||||
{%- block header %}{% endblock %}
|
||||
|
||||
{%- block relbar1 %}{{ relbar() }}{% endblock %}
|
||||
|
||||
{%- block content %}
|
||||
{%- block sidebar1 %} {# possible location for sidebar #} {% endblock %}
|
||||
|
||||
<div class="document">
|
||||
{%- block document %}
|
||||
<div class="documentwrapper">
|
||||
{%- if render_sidebar %}
|
||||
<div class="bodywrapper">
|
||||
{%- endif %}
|
||||
<div class="body" role="main">
|
||||
{% block body %} {% endblock %}
|
||||
</div>
|
||||
{%- if render_sidebar %}
|
||||
</div>
|
||||
{%- endif %}
|
||||
</div>
|
||||
{%- endblock %}
|
||||
|
||||
{%- block sidebar2 %}{{ sidebar() }}{% endblock %}
|
||||
<div class="clearer"></div>
|
||||
</div>
|
||||
{%- endblock %}
|
||||
|
||||
{%- block relbar2 %}{{ relbar() }}{% endblock %}
|
||||
|
||||
{%- block footer %}
|
||||
<div class="footer" role="contentinfo">
|
||||
{%- if show_copyright %}
|
||||
{%- if hasdoc('copyright') %}
|
||||
{% trans path=pathto('copyright'), copyright=copyright|e %}© <a href="{{ path }}">Copyright</a> {{ copyright }}.{% endtrans %}
|
||||
{%- else %}
|
||||
{% trans copyright=copyright|e %}© Copyright {{ copyright }}.{% endtrans %}
|
||||
{%- endif %}
|
||||
{%- endif %}
|
||||
{%- if last_updated %}
|
||||
{% trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %}
|
||||
{%- endif %}
|
||||
{%- if show_sphinx %}
|
||||
{% trans sphinx_version=sphinx_version|e %}Created using <a href="http://sphinx-doc.org/">Sphinx</a> {{ sphinx_version }}.{% endtrans %}
|
||||
{%- endif %}
|
||||
</div>
|
||||
{%- endblock %}
|
||||
</body>
|
||||
</html>
|
||||
2
lib/borealis/library/lib/extern/fmt/doc/basic-bootstrap/theme.conf
vendored
Normal file
2
lib/borealis/library/lib/extern/fmt/doc/basic-bootstrap/theme.conf
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
[theme]
|
||||
inherit = basic
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user