79dc0fd773
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@1455 42af7a65-404d-4744-a932-0658087f49c3
3148 lines
103 KiB
HTML
3148 lines
103 KiB
HTML
<html>
|
|
<head>
|
|
<title>NX Graphics Subsystem</title>
|
|
<meta name="author" content="Gregory Nutt">
|
|
</head>
|
|
|
|
<body background="backgd.gif">
|
|
<hr><hr>
|
|
<table width ="100%">
|
|
<tr align="center" bgcolor="#e4e4e4">
|
|
<td>
|
|
<h1><big><font color="#3c34ec">
|
|
<i>NX Graphics Subsystem</i>
|
|
</font></big></h1>
|
|
<p>Last Updated: December 5, 2008</p>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<hr><hr>
|
|
|
|
<table width ="100%">
|
|
<tr bgcolor="#e4e4e4">
|
|
<td>
|
|
<h1>Table of Contents</h1>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<table width="100%">
|
|
<tr>
|
|
<td align="left" valign="top">
|
|
<p>
|
|
<big><b>1.0</b> <a href="#Introduction">Introduction</a></big>
|
|
</p>
|
|
<ul>
|
|
<p>
|
|
<i><b>1.1</b> <a href="#Overview">Overview</a><br></i>
|
|
<i><b>1.2</b> <a href="#Objectives">Objectives</a></i><br>
|
|
<i><b>1.3</b> <a href="#Organization">Organization</a></i>
|
|
</p>
|
|
<p>
|
|
<ul>
|
|
<i>1.3.1 <a href="#nxgl1">NX Graphics Library (<code>NXGL</code>)</a></i><br>
|
|
<i>1.3.2 <a href="#nx1">NX (NXSU and NXMU)</a></i><br>
|
|
<i>1.3.3 <a href="#nxtk1">NX Tool Kit (<code>NXTK</code>)</a></i><br>
|
|
<i>1.3.4 <a href="#nxfonts1">NX Fonts Support (<code>NXFONTS</code>)</a></i><br>
|
|
<i>1.3.5 <a href="#nxwidgets1">NX Widgets (<code>NXWIDGETS</code>)</a></i>
|
|
</ul>
|
|
</p>
|
|
</ul>
|
|
<p>
|
|
<big><b>2.0</b> <a href="#nxapis">NX User APIs</a></big>
|
|
</p>
|
|
<ul>
|
|
<p>
|
|
<i><b>2.1</b> <a href="#nxheaders">NX Header Files</a></i><br>
|
|
<i><b>2.2</b> <a href="#nxgl2">NX Graphics Library (<code>NXGL</code>)</a></i>
|
|
</p>
|
|
<p>
|
|
<ul>
|
|
<i>2.2.1 <a href="#nxgltypes">NXGL Types</a></i><br>
|
|
<i>2.2.1 <a href="#nxglrgb2yuv"><code>nxgl_rgb2yuv()</code></a></i><br>
|
|
<i>2.2.2 <a href="#nxglyuv2rgb"><code>nxgl_yuv2rgb()</code></a></i><br>
|
|
<i>2.2.3 <a href="#nxglrectcopy"><code>nxgl_rectcopy()</code></a></i><br>
|
|
<i>2.2.4 <a href="#nxglrectoffset"><code>nxgl_rectoffset()</code></a></i><br>
|
|
<i>2.2.5 <a href="#nxglvectoradd"><code>nxgl_vectoradd()</code></a></i><br>
|
|
<i>2.2.6 <a href="#nxglvectorsubtract"><code>nxgl_vectorsubtract()</code></a></i><br>
|
|
<i>2.2.7 <a href="#nxglrectintersect"><code>nxgl_rectintersect()</code></a></i><br>
|
|
<i>2.2.8 <a href="#nxglrectunion"><code>nxgl_rectunion()</code></a></i><br>
|
|
<i>2.2.9 <a href="#nxglnonintersecting"><code>nxgl_nonintersecting()</code></a></i><br>
|
|
<i>2.2.10 <a href="#nxglrectoverlap"><code>nxgl_rectoverlap()</code></a></i><br>
|
|
<i>2.2.11 <a href="#nxglrectinside"><code>nxgl_rectinside()</code></a></i><br>
|
|
<i>2.2.12 <a href="#nxglrectsize"><code>nxgl_rectsize()</code></a></i><br>
|
|
<i>2.2.13 <a href="#nxglnullrect"><code>nxgl_nullrect()</code></a></i><br>
|
|
<i>2.2.14 <a href="#nxglrunoffset"><code>nxgl_runoffset()</code></a></i><br>
|
|
<i>2.2.15 <a href="#nxglruncopy"><code>nxgl_runcopy()</code></a></i><br>
|
|
<i>2.2.16 <a href="#nxgltrapoffset"><code>nxgl_trapoffset()</code></a></i><br>
|
|
<i>2.2.17 <a href="#nxgltrapcopy"><code>nxgl_trapcopy()</code></a></i><br>
|
|
<i>2.2.18 <a href="#nxglcolorcopy"><code>nxgl_colorcopy</code></a></i>
|
|
</ul>
|
|
</p>
|
|
<p>
|
|
<i><b>2.3</b> <a href="#nx2">NX</a></i>
|
|
</p>
|
|
<p>
|
|
<ul>
|
|
<i>2.3.1 <a href="#nxppdefs">Pre-Processor Definitions</a></i><br>
|
|
<i>2.3.2 <a href="#nxtypes">NX Types</a></i><br>
|
|
<i>2.3.3 <a href="#nxtypes">NX Server Callbacks</a></i>
|
|
<p>
|
|
<ul>
|
|
<i>2.3.3.1 <a href="#nxcbredraw"><code>redraw()</code></a></i><br>
|
|
<i>2.3.3.2 <a href="#nxcbposition"><code>position()</code></a></i><br>
|
|
<i>2.3.3.3 <a href="#nxcbmousein"><code>mousein()</code></a></i><br>
|
|
<i>2.3.3.4 <a href="#nxcbkbdin"><code>kbdin()</code></a></i>
|
|
</ul>
|
|
<p>
|
|
<i>2.3.4 <a href="#nxruninstance"><code>nx_runinstance()</code> (and <code>nx_run()<code> macro)</a></i><br>
|
|
<i>2.3.5 <a href="#nxconnectinstance"><code>nx_connectinstance()</code> (and <code>nx_connect()</code> macro)</a></i><br>
|
|
<i>2.3.6 <a href="#nxopen"><code>nx_open()</code></a></i><br>
|
|
<i>2.3.7 <a href="#nxdisconnect"><code>nx_disconnect()</code></a></i><br>
|
|
<i>2.3.8 <a href="#nxclose"><code>nx_close()</code></a></i><br>
|
|
<i>2.3.9 <a href="#nxeventhandler"><code>nx_eventhandler()</code></a></i><br>
|
|
<i>2.3.10 <a href="#nxeventnotify"><code>nx_eventnotify()</code></a></i><br>
|
|
<i>2.3.11 <a href="#nxopenwindow"><code>nx_openwindow()</code></a></i><br>
|
|
<i>2.3.12 <a href="#nxclosewindow"><code>nx_closewindow()</code></a></i><br>
|
|
<i>2.3.13 <a href="#nxrequestbkgd"><code>nx_requestbkgd()</code></a></i><br>
|
|
<i>2.3.14 <a href="#nxreleasebkgd"><code>nx_releasebkgd()</code></a></i><br>
|
|
<i>2.3.15 <a href="#nxgetposition"><code>nx_getposition()</code></a></i><br>
|
|
<i>2.3.16 <a href="#nxsetposition"><code>nx_setposition()</code></a></i><br>
|
|
<i>2.3.17 <a href="#nxsetsize"><code>nx_setsize()</code></a></i><br>
|
|
<i>2.3.18 <a href="#nxraise"><code>nx_raise()</code></a></i><br>
|
|
<i>2.3.19 <a href="#nxlower"><code>nx_lower()</code></a></i><br>
|
|
<i>2.3.20 <a href="#nxfill"><code>nx_fill()</code></a></i><br>
|
|
<i>2.3.21 <a href="#nxfilltrapezoid"><code>nx_filltrapezoid()</code></a></i><br>
|
|
<i>2.3.22 <a href="#nxglrgb2yuv"><code>nx_setbgcolor()</code></a></i><br>
|
|
<i>2.3.23 <a href="#nxmove"><code>nx_move()</code></a></i><br>
|
|
<i>2.3.24 <a href="#nxbitmap"><code>nx_bitmap()</code></a></i><br>
|
|
<i>2.3.25 <a href="#nxkbdin"><code>nx_kbdin()</code></a></i><br>
|
|
<i>2.3.26 <a href="#nxmousein"><code>nx_mousein()</code></a></i><br>
|
|
</ul>
|
|
</p>
|
|
</td>
|
|
<td align="left" valign="top">
|
|
<p>
|
|
<i><b>2.4</b> <a href="#nxtk2">NX Tool Kit (<code>NXTK</code>)</a></i>
|
|
</p>
|
|
<p>
|
|
<ul>
|
|
<i>2.4.1 <a href="#nxtktypes"><code>NXTK Types()</code></a></i><br>
|
|
<i>2.4.2 <a href="#nxtkopenwindow"><code>nxtk_openwindow()</code></a></i><br>
|
|
<i>2.4.3 <a href="#nxtkclosewindow"><code>nxtk_closewindow()</code></a></i><br>
|
|
<i>2.4.4 <a href="#nxtkgetposition"><code>nxtk_getposition()</code></a></i><br>
|
|
<i>2.4.5 <a href="#nxtksetposition"><code>nxtk_setposition()</code></a></i><br>
|
|
<i>2.4.6 <a href="#nxtksetsize"><code>nxtk_setsize()</code></a></i><br>
|
|
<i>2.4.7 <a href="#nxtkraise"><code>nxtk_raise()</code></a></i><br>
|
|
<i>2.4.8 <a href="#nxtklower"><code>nxtk_lower()</code></a></i><br>
|
|
<i>2.4.9 <a href="#nxtkfillwindow"><code>nxtk_fillwindow()</code></a></i><br>
|
|
<i>2.4.10 <a href="#nxtkfilltrapwindow"><code>nxtk_filltrapwindow()</code></a></i><br>
|
|
<i>2.4.11 <a href="#nxtkmovewindow"><code>nxtk_movewindow()</code></a></i><br>
|
|
<i>2.4.12 <a href="#nxtkbitmapwindow"><code>nxtk_bitmapwindow()</code></a></i><br>
|
|
<i>2.4.13 <a href="#nxtkopentoolbar"><code>nxtk_opentoolbar()</code></a></i><br>
|
|
<i>2.4.14 <a href="#nxtkclosetoolbar"><code>nxtk_closetoolbar()</code></a></i><br>
|
|
<i>2.4.15 <a href="#nxtkfilltoolbar"><code>nxtk_filltoolbar()</code></a></i><br>
|
|
<i>2.4.16 <a href="#nxtkfilltraptoolbar"><code>nxtk_filltraptoolbar()</code></a></i><br>
|
|
<i>2.4.17 <a href="#nxtkmovetoolbar"><code>nxtk_movetoolbar()</code></a></i><br>
|
|
<i>2.4.18 <a href="#nxtkbitmaptoolbar"><code>nxtk_bitmaptoolbar()</code></a></i>
|
|
</ul>
|
|
</p>
|
|
<p>
|
|
<i><b>2.5</b> <a href="#nxfonts2">NX Fonts Support (<code>NXFONTS</code>)</a></i>
|
|
</p>
|
|
<p>
|
|
<ul>
|
|
<i>2.5.1 <a href="#nxfontstypes"><code>NXFONTS Types()</code></a></i><br>
|
|
<i>2.5.2 <a href="#nxfgetfontset"><code>nxf_getfontset()</code></a></i><br>
|
|
<i>2.5.3 <a href="#nxfgetbitmap"><code>nxf_getbitmap()</code></a></i><br>
|
|
<i>2.5.4 <a href="#nxfconvertbpp"><code>nxf_convert_*bpp()</code></a></i>
|
|
</ul>
|
|
</p>
|
|
<p>
|
|
<i><b>2.6</b> <a href="#samplecode">Sample Code</a></i>
|
|
</p>
|
|
</ul>
|
|
<p>
|
|
<big><b>Appendix A</b> <a href="#grapicsdirs"><code>graphics/</code> Directory Structure</a></big><br>
|
|
<big><b>Appendix B</b> <a href="#nxconfigs">NX Configuration Options</a></big>
|
|
</p>
|
|
<p>
|
|
<ul>
|
|
<i><b>B.1</b> <a href="#nxgenconfig">General Configuration Settings</a></i><br>
|
|
<i><b>B.2</b> <a href="#nxglconfig">NXGL Configuration Settings</a></i><br>
|
|
<i><b>B.3</b> <a href="#nxconfig">NX Configuration Settings</a></i><br>
|
|
<i><b>B.4</b> <a href="#nxmuconfig">NX Multi-User (Only) Configuration Settings</a></i><br>
|
|
<i><b>B.5</b> <a href="#nxtkconfig">NXTK Configuration Settings</a></i><br>
|
|
<i><b>B.6</b> <a href="#nxfpmtsconfig">NXFONTS Configuration Settings</a></i>
|
|
</ul>
|
|
</p>
|
|
<p>
|
|
<big><b>Appendix C</b> <a href="#testcoverage">NX Test Coverage</a></big>
|
|
</p>
|
|
<ul>
|
|
<i><b>Table C.1:</b> <a href="#nxglibcoverage">NXGLIB API Test Coverage</a></i><br>
|
|
<i><b>Table C.2:</b> <a href="#nxcbcoverage">NX Server Callbacks Test Coverage</a></i><br>
|
|
<i><b>Table C.3:</b> <a href="#nxcoverage">NX API Test Coverage</a></i><br>
|
|
<i><b>Table C.4:</b> <a href="#nxtkcoverage">NXTK API Test Coverage</a></i><br>
|
|
<i><b>Table C.5:</b> <a href="#nxfontscoverage">NXFONTS API Test Coverage</a></i><br>
|
|
</ul>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<table width ="100%">
|
|
<tr bgcolor="#e4e4e4">
|
|
<td>
|
|
<h1>1.0 <a name="Introduction">Introduction</a></h1>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<h2>1.1 <a name="Overview">Overview</a></h2>
|
|
<p>
|
|
This document describes the tiny graphics support included in NuttX.
|
|
It includes an overview description of that graphics support, detailed
|
|
descriptions of the NuttX graphics APIs, and discussion of code organization,
|
|
and OS configuration options.
|
|
</p>
|
|
|
|
<center><table width="480">
|
|
<tr>
|
|
<td><a name="screenshot"><img src="NuttXScreenShot.jpg"></a></td>
|
|
</tr>
|
|
<tr>
|
|
<td><small>Figure 1.
|
|
This sceen shot shows the final frame for the NuttX example at <code>examples/nx</code>
|
|
running on the simulated, Linux x86 platform with simulated framebuffer output to
|
|
an X window.
|
|
This picture shows to framed windows with (blank) toolbars.
|
|
Each window has displayed text as received from the NX keyboard interface
|
|
The second window has just been raised to the top of the display.
|
|
</small>
|
|
</tr>
|
|
</table></center>
|
|
|
|
|
|
<h2>1.2 <a name="Objectives">Objectives</a></h2>
|
|
|
|
<p>
|
|
The objective of this development was to provide a tiny windowing system in the
|
|
spirit of X, but greatly scaled down and appropriate for most resource-limited
|
|
embedded environments.
|
|
The current NX implementation supports the general following, high-level features:
|
|
</p>
|
|
<ul>
|
|
<li><b>Virtual Vertical Graphics Space</b>.
|
|
Windows that reside in a virtual, <i>vertical</i> space so that it makes
|
|
sense to talk about one window being on top of another and obcuring the
|
|
window below it.
|
|
</li>
|
|
<li><b>Client/Server Model</b>.
|
|
A standard client server/model was adopted. NX may be considered a server
|
|
and other logic that presents the windows are NX clients.
|
|
</li>
|
|
<li><b>Single- and Multi-User Support</b>.
|
|
NX includes <i>front-end</i> logic to either a simple single-thread/single-user
|
|
architecture or a separate NX server thread that can serve multiple NX client threads.
|
|
In the single-user case, the NX <i>server</i> is simply a set of library
|
|
calls; in the multi-user case, NX is a server thread/daemon the serializes
|
|
graphics operations from multiple clients.
|
|
Other some unique start-up/connection logic, the APIs supported by the single-user
|
|
and multi-user front-ends are identical.
|
|
Providing both front-ends is consistent with the NuttX commitment to scalability.
|
|
</li>
|
|
<li><b>Minimal Graphics Toolset</b>.
|
|
The actual implementation of the graphics operations is performed by common,
|
|
<i>back-end</i> logic. This back-end supports only a primitive set of graphic
|
|
and rendering operations.
|
|
</li>
|
|
<li><b>Framebuffer Device Interface</b>.
|
|
NX supports any graphics device using the NuttX framebuffer <i>driver</i>
|
|
interface.
|
|
(However, the dependency of NX on framebuffer drivers is minimal and the
|
|
logic could be extended to other interfaces -- such as a serial LCD -- with
|
|
some minimal effort).
|
|
<li><b>Transparent to NX Client</b>.
|
|
The window client on "sees" the sub-window that is operates in
|
|
and does not need to be concerned with the virtual, vertical space (other
|
|
that to respond to <i>redraw</i> requests from NX when needed).
|
|
</li>
|
|
<li><b>Framed Windows and Toolbars</b>.
|
|
NX also adds the capability to support windows with frames and toolbars on
|
|
top of the basic windowing support.
|
|
These are windows such as those shown in the
|
|
<a href="#screenshot">screenshot</a> above.
|
|
These framed windows sub-divide one one window into three relatively independent
|
|
subwindows: A frame, the contained window and an (optional) toolbar window.
|
|
</li>
|
|
<li><b>Mouse Support</b>.
|
|
NX provides support for a mouse or other X/Y pointing devices.
|
|
APIs are provided to allow external devices to give X/Y position information
|
|
and mouse button presses to NX.
|
|
NX will then provide the mouse input to the relevant window clients via callbacks.
|
|
Client windows only receive the mouse input callback if the mouse is positioned over a visible
|
|
portion of the client window; X/Y position is provided to the client in the relative
|
|
coordinate system of the client window.
|
|
</li>
|
|
<li><b>Keyboard input</b>.
|
|
NX also supports keyboard/keypad devices.
|
|
APIs are provided to allow external devices to give keypad information to NX.
|
|
NX will then provide the mouse input to the top window on the display (the window
|
|
that has the <i>focus</i>) via a callback function.
|
|
</li>
|
|
</ul>
|
|
|
|
<h2>1.3 <a name="Organization">Organization</a></h2>
|
|
|
|
<p>
|
|
NX is organized into 6 (and perhaps someday 7 or 8) logical modules.
|
|
These logical modules also correspond to the directory organization.
|
|
That NuttX directory organization is discussed in
|
|
<a href="#grapicsdirs">Appendix B</a> of this document.
|
|
The logic modules are discussed in the following sub-paragraphs.
|
|
</p>
|
|
|
|
<p>
|
|
<center><img src="NXOrganization.gif" width="60%"></center>
|
|
</p>
|
|
|
|
<h3>1.3.1 <a name="nxgl1">NX Graphics Library (<code>NXGL</code>)</a></h3>
|
|
|
|
<p>
|
|
NXGLIB is a standalone library that contains low-level graphics utilities and
|
|
direct framebuffer rendering logic. NX is built on top NXGLIB.
|
|
</p>
|
|
|
|
<h3>1.3.2 <a name="nx1">NX (<code>NXSU</code> and <code>NXMU</code>)</a></h3>
|
|
|
|
<p>
|
|
NX is the tiny NuttX windowing system for raw windows (i.e., simple regions of
|
|
graphics memory).
|
|
NX includes both a small-footprint, single user implementaton (NXSU) and a somewhat
|
|
larger multi-user implentation (NXMU as described below).
|
|
Both conform to the same APIs as defined in <code>include/nuttx/nx.h</code> and, hence,
|
|
are interchangable<sup>1</sup>.
|
|
NX can be used without NXWIDGETS and without NXTOOLKIT for raw window displays.
|
|
</p>
|
|
|
|
<p>
|
|
<sup>1</sup><small>NXMU and NXSU are interchangeable other than (1) certain start-up
|
|
and intialization APIs (as described below), and (2) timing. With NXSU, NX APIs
|
|
execute immediately; with NXMU, NX APIs defer and serialize the operations and, hence,
|
|
introduce different timing and potential race conditions that you would not experience
|
|
with NXSU.</small>
|
|
</p>
|
|
|
|
<p><b>NXNULL?</b>
|
|
At one time, I also envisoned a <i>NULL</i> front-end that did not support windowing
|
|
at all but, rather, simply provided the entire framebuffer memory as one dumb window.
|
|
This has the advantage that the same NX APIs can be used on the one dumb window as
|
|
for the other NX windows.
|
|
This would be in the NuttX spirit of scalability.
|
|
</p>
|
|
<p>
|
|
However, the same end result can be obtained by using the
|
|
<a href="#nxrequestbkgd"><code>nx_requestbkgd()</code></a> API.
|
|
It still may be possible to reduce the footprint in this usage case by developing
|
|
and even thinner NXNULL front-end.
|
|
That is a possible future development.
|
|
</p>
|
|
|
|
<h3>1.3.3 <a name="nxtk1">NX Tool Kit (<code>NXTK</code>)</a></h3>
|
|
|
|
<p>
|
|
NXTK is a s set of C graphics tools that provide higher-level window drawing
|
|
operations.
|
|
This is the module where the framed windows and toolbar logic is implemented.
|
|
NXTK is built on top of NX and does not depend on NXWIDGETS.
|
|
</p>
|
|
|
|
<h3>1.3.4 <a name="nxfonts1">NX Fonts Support (<code>NXFONTS</code>)</a></h3>
|
|
|
|
<p>
|
|
A set of C graphics tools for present (bitmap) font images.
|
|
The font implementation is at a very low level or graphics operation,
|
|
comparable to the logic in NXGLIB.
|
|
NXFONTS does not depend on any NX module other than some utilities and types from NXGLIB.
|
|
</p>
|
|
|
|
<h3>1.3.5 <a name="nxwidgets1">NX Widgets (<code>NXWIDGETS</code>)</a></h3>
|
|
|
|
<p>
|
|
I had originally planned a high level, C++, object-oriented library for
|
|
object-oriented access to graphics <i>widgets</i>.
|
|
However, C++ compilers are not available for some of the targets supported by NuttX.
|
|
So I have decided to implement the entire solution in C.
|
|
That decision makes the solution somewhat more difficult to work with, but supports all platforms.
|
|
</p>
|
|
<p>
|
|
At this point, the amount of C in the implementation would make conversion to C++ a
|
|
more difficult job.
|
|
I leave the C++ widget interface to any contributor who may have an interest in such things.
|
|
</p>
|
|
|
|
<table width ="100%">
|
|
<tr bgcolor="#e4e4e4">
|
|
<td>
|
|
<h1>2.0 <a name="nxapis">NX User APIs</a></h1>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<h2>2.1 <a name="nxheaders">NX Header Files</a></h2>
|
|
|
|
<ul><dl>
|
|
<dt><code>include/nuttx/nxglib.h
|
|
<dd>Describes the NXGLIB C interfaces
|
|
<dt><code>include/nuttx/nx.h
|
|
<dd>Describes the NX C interfaces
|
|
<dt><code>include/nutt/nxtk.h
|
|
<dd>Describe the NXTOOLKIT C interfaces
|
|
<dt><code>include/nutt/nxfont.h
|
|
<dd>Describe sthe NXFONT C interfaces
|
|
<dt><code>include/nuttx/nxwidgets.h
|
|
<dd>Will describe the NXWIDGETS classes (no longer planned)
|
|
</dl></ul>
|
|
|
|
<h2>2.2 <a name="nxgl2">NX Graphics Library (<code>NXGL</code>)</a></h2>
|
|
|
|
<p>
|
|
NXGL provides many APIs, some available for use internally by NX and
|
|
others for use by applications as well.
|
|
Only those APIs intended for application usage are documented here
|
|
See <code>include/nuttx/nxglib.h</code> for the full set of APIs;
|
|
those APIs might be of interest if you are rendering directly into
|
|
framebuffer memory.
|
|
</p>
|
|
|
|
<h3>2.2.1 <a name="nxgltypes">NXGL Types</a></h3>
|
|
|
|
<p>
|
|
<code>nxgl_mxpixel_t</code>.
|
|
Holds one device pixel.
|
|
NXGLIB will select the smallest size for the <code>nxgl_mxpixel_t</code>
|
|
that just contains the pixel: <code>byte</code> if 16, 24, and 32 resolution
|
|
support is disabled, <code>uint16</code> if 24, and 32 resolution
|
|
support is disabled, or <code>uint32</code>.
|
|
</p>
|
|
|
|
<p>
|
|
<code>nxgl_coord_t</b>
|
|
A given coordinate is limited to the screen height an width. If either
|
|
of those values exceed 32,767 pixels, then the following will have to need
|
|
to change:
|
|
</p>
|
|
<ul><pre>
|
|
typedef sint16 nxgl_coord_t;
|
|
</pre></ul>
|
|
|
|
<p>
|
|
<code>struct nxgl_point_s</code>. Describes a point on the display:
|
|
</p>
|
|
<ul><pre>
|
|
struct nxgl_point_s
|
|
{
|
|
nxgl_coord_t x; /* X position, range: 0 to screen width - 1 */
|
|
nxgl_coord_t y; /* Y position, range: 0 to screen height - 1 */
|
|
};
|
|
</pre></ul>
|
|
|
|
<p>
|
|
<code>struct nxgl_size_s</code>. Describes the size of a rectangular region.
|
|
</p>
|
|
<ul><pre>
|
|
struct nxgl_size_s
|
|
{
|
|
nxgl_coord_t w; /* Width in pixels */
|
|
nxgl_coord_t h; /* Height in rows */
|
|
};
|
|
</pre></ul>
|
|
|
|
<p>
|
|
<code>struct nxgl_rect_s</code>. Describes a positioned rectangle on the display.
|
|
</p>
|
|
<ul><pre>
|
|
struct nxgl_rect_s
|
|
{
|
|
struct nxgl_point_s pt1; /* Upper, left-hand corner */
|
|
struct nxgl_point_s pt2; /* Lower, right-hand corner */
|
|
};
|
|
</pre></ul>
|
|
|
|
<p>
|
|
<code>struct nxgl_run_s</code>.
|
|
Describes a run, i.e., a horizontal line. Note that the start/end positions
|
|
have fractional precision. This is necessary for good joining of trapezoids
|
|
when a more complex shape is decomposed into trapezoids
|
|
</p>
|
|
<ul><pre>
|
|
struct nxgl_run_s
|
|
{
|
|
b16_t x1; /* Left X position, range: 0 to x2 */
|
|
b16_t x2; /* Right X position, range: x1 to screen width - 1 */
|
|
nxgl_coord_t y; /* Top Y position, range: 0 to screen height - 1 */
|
|
};
|
|
</pre></ul>
|
|
|
|
<p>
|
|
<code>struct nxgl_trapezoid_s</code>.
|
|
Describes a horizontal trapezoid on the display in terms the run at the
|
|
top of the trapezoid and the run at the bottom
|
|
</p>
|
|
<ul><pre>
|
|
struct nxgl_trapezoid_s
|
|
{
|
|
struct nxgl_run_s top; /* Top run */
|
|
struct nxgl_run_s bot; /* bottom run */
|
|
};
|
|
</pre></ul>
|
|
|
|
<h3>2.2.1 <a name="nxglrgb2yuv"><code>nxgl_rgb2yuv()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
void nxgl_rgb2yuv(ubyte r, ubyte g, ubyte b, ubyte *y, ubyte *u, ubyte *v);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Convert 8-bit RGB triplet to 8-bit YUV triplet.
|
|
</p>
|
|
|
|
<h3>2.2.2 <a name="nxglyuv2rgb"><code>nxgl_yuv2rgb()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
void nxgl_yuv2rgb(ubyte y, ubyte u, ubyte v, ubyte *r, ubyte *g, ubyte *b);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Convert 8-bit RGB triplet to 8-bit YUV triplet.
|
|
</p>
|
|
|
|
<h3>2.2.3 <a name="nxglrectcopy"><code>nxgl_rectcopy()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
void nxgl_rectcopy(FAR struct nxgl_rect_s *dest,
|
|
FAR const struct nxgl_rect_s *src);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
This is essentially <code>memcpy()</code>for rectangles. We don't do structure
|
|
assignments because some compilers are not good at that.
|
|
</p>
|
|
|
|
<h3>2.2.4 <a name="nxglrectoffset"><code>nxgl_rectoffset()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
void nxgl_rectoffset(FAR struct nxgl_rect_s *dest,
|
|
FAR const struct nxgl_rect_s *src,
|
|
nxgl_coord_t dx, nxgl_coord_t dy);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Offset the rectangle position by the specified dx, dy values.
|
|
</p>
|
|
|
|
<h3>2.2.5 <a name="nxglvectoradd"><code>nxgl_vectoradd()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
void nxgl_vectoradd(FAR struct nxgl_point_s *dest,
|
|
FAR const struct nxgl_point_s *v1,
|
|
FAR const struct nxgl_point_s *v2);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Add two 2x1 vectors and save the result to a third.
|
|
</p>
|
|
|
|
<h3>2.2.6 <a name="nxglvectorsubtract"><code>nxgl_vectorsubtract()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
void nxgl_vectsubtract(FAR struct nxgl_point_s *dest,
|
|
FAR const struct nxgl_point_s *v1,
|
|
FAR const struct nxgl_point_s *v2);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Add subtract vector <code>v2</code> from vector <code>v1</code> and return the result in vector dest.
|
|
</p>
|
|
|
|
<h3>2.2.7 <a name="nxglrectintersect"><code>nxgl_rectintersect()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
void nxgl_rectintersect(FAR struct nxgl_rect_s *dest,
|
|
FAR const struct nxgl_rect_s *src1,
|
|
FAR const struct nxgl_rect_s *src2);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Return the rectangle representing the intersection of the two rectangles.
|
|
</p>
|
|
|
|
<h3>2.2.8 <a name="nxglrectunion"><code>nxgl_rectunion()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
void nxgl_rectunion(FAR struct nxgl_rect_s *dest,
|
|
FAR const struct nxgl_rect_s *src1,
|
|
FAR const struct nxgl_rect_s *src2);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Given two rectanges, <code>src1</code> and <code>src2</code>, return the larger rectangle that
|
|
contains both, <code>dest</code>.
|
|
</p>
|
|
|
|
<h3>2.2.9 <a name="nxglnonintersecting"><code>nxgl_nonintersecting()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
nxgl_nonintersecting(FAR struct nxgl_rect_s result[4],
|
|
FAR const struct nxgl_rect_s *rect1,
|
|
FAR const struct nxgl_rect_s *rect2);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Return the regions of rectangle <code>rect1</code> that do not intersect with
|
|
<code>rect2</code>. This will four rectangles, some of which may be
|
|
degenerate (and can be picked off with <a href="#nxglnullrect"><code>nxgl_nullrect()<code></a>).
|
|
</p>
|
|
|
|
<h3>2.2.10 <a name="nxglrectoverlap"><code>nxgl_rectoverlap()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
boolean nxgl_rectoverlap(FAR struct nxgl_rect_s *rect1,
|
|
FAR struct nxgl_rect_s *rect2);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Return TRUE if the two rectangles overlap.
|
|
</p>
|
|
|
|
<h3>2.2.11 <a name="nxglrectinside"><code>nxgl_rectinside()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
boolean nxgl_rectinside(FAR const struct nxgl_rect_s *rect,
|
|
FAR const struct nxgl_point_s *pt);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Return TRUE if the point <code>pt</code> lies within <code>rect</code>.
|
|
</p>
|
|
|
|
<h3>2.2.12 <a name="nxglrectsize"><code>nxgl_rectsize()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
void nxgl_rectsize(FAR struct nxgl_size_s *size,
|
|
FAR const struct nxgl_rect_s *rect);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Return the size of the specified rectangle.
|
|
</p>
|
|
|
|
<h3>2.2.13 <a name="nxglnullrect"><code>nxgl_nullrect()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
boolean nxgl_nullrect(FAR const struct nxgl_rect_s *rect);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Return TRUE if the area of the retangle is <= 0.
|
|
</p>
|
|
|
|
<h3>2.2.14 <a name="nxglrunoffset"><code>nxgl_runoffset()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
void nxgl_runoffset(FAR struct nxgl_run_s *dest,
|
|
FAR const struct nxgl_run_s *src,
|
|
nxgl_coord_t dx, nxgl_coord_t dy);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Offset the run position by the specified <code>dx</code>, <code>dy</code> values.
|
|
</p>
|
|
|
|
<h3>2.2.15 <a name="nxglruncopy"><code>nxgl_runcopy()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
void nxgl_runcopy(FAR struct nxgl_run_s *dest,
|
|
FAR const struct nxgl_run_s *src);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
This is essentially <code>memcpy()</code>for runs. We don't do structure assignments
|
|
because some compilers are not good at that.
|
|
</p>
|
|
|
|
<h3>2.2.16 <a name="nxgltrapoffset"><code>nxgl_trapoffset()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
void nxgl_trapoffset(FAR struct nxgl_trapezoid_s *dest,
|
|
FAR const struct nxgl_trapezoid_s *src,
|
|
nxgl_coord_t dx, nxgl_coord_t dy);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Offset the trapezoid position by the specified <code>dx</code>, <code>dy</code> values.
|
|
</p>
|
|
|
|
<h3>2.2.1 <a name="nxgltrapcopy"><code>nxgl_trapcopy()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
void nxgl_trapcopy(FAR struct nxgl_trapezoid_s *dest,
|
|
FAR const struct nxgl_trapezoid_s *src);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
This is essentially <code>memcpy()</code>for trapezoids. We don't do structure
|
|
assignments because some compilers are not good at that.
|
|
</p>
|
|
|
|
<h3>2.2.1 <a name="nxglcolorcopy"><code>nxgl_colorcopy</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
nxgl_colorcopy(nxgl_mxpixel_t dest[CONFIG_NX_NPLANES],
|
|
const nxgl_mxpixel_t src[CONFIG_NX_NPLANES]);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
This is essentially <code>memcpy()</code>for colors. This does very little for us
|
|
other than hide all of the conditional compilation for planar colors
|
|
in one place.
|
|
</p>
|
|
|
|
<h2>2.3 <a name="nx2">NX</a></h2>
|
|
|
|
<h3>2.3.1 <a name="nxppdefs">Pre-Processor Definitions</a></h3>
|
|
|
|
<p>
|
|
The default server message queue name used by the
|
|
<a href="#nxruninstance"><code>nx_run()</code></a> macro:
|
|
</p>
|
|
<ul><pre>
|
|
#define NX_DEFAULT_SERVER_MQNAME "/dev/nxs"
|
|
</pre></ul>
|
|
|
|
<p>
|
|
Mouse button bits:
|
|
</p>
|
|
<ul><pre>
|
|
#define NX_MOUSE_NOBUTTONS 0x00
|
|
#define NX_MOUSE_LEFTBUTTON 0x01
|
|
#define NX_MOUSE_CENTERBUTTON 0x02
|
|
#define NX_MOUSE_RIGHTBUTTON 0x04
|
|
</pre></ul>
|
|
|
|
<h3>2.3.2 <a name="nxtypes">NX Types</a></h3>
|
|
|
|
<p>
|
|
The interface to the NX server is managed using a opaque handle:
|
|
</p>
|
|
<ul><pre>
|
|
typedef FAR void *NXHANDLE;
|
|
</pre></ul>
|
|
|
|
<p>
|
|
The interface to a specific window is managed using an opaque handle:
|
|
</p>
|
|
<ul><pre>
|
|
typedef FAR void *NXWINDOW;
|
|
</pre></ul>
|
|
|
|
<p>
|
|
These define callbacks that must be provided to
|
|
<a href="#nxopenwindow"><code>nx_openwindow()</code></a>.
|
|
In the multi-user model, these callbacks will be invoked as part of the
|
|
processing performed by
|
|
<a href="#nxeventhandler"><code>nx_eventhandler()</code></a>.
|
|
</p>
|
|
<ul><pre>
|
|
struct nx_callback_s
|
|
{
|
|
void (*redraw)(NXWINDOW hwnd, FAR const struct nxgl_rect_s *rect,
|
|
boolean more, FAR void *arg);
|
|
void (*position)(NXWINDOW hwnd, FAR const struct nxgl_size_s *size,
|
|
FAR const struct nxgl_point_s *pos,
|
|
FAR const struct nxgl_rect_s *bounds,
|
|
FAR void *arg);
|
|
#ifdef CONFIG_NX_MOUSE
|
|
void (*mousein)(NXWINDOW hwnd, FAR const struct nxgl_point_s *pos,
|
|
ubyte buttons, FAR void *arg);
|
|
#endif
|
|
#ifdef CONFIG_NX_KBD
|
|
void (*kbdin)(NXWINDOW hwnd, ubyte nch, FAR const ubyte *ch, FAR void *arg);
|
|
#endif
|
|
};
|
|
</pre></ul>
|
|
|
|
<h3>2.3.3 <a name="nxtypes">NX Server Callbacks</a></h3>
|
|
|
|
<h4>2.3.3.1 <a name="nxcbredraw"><code>redraw()</code></a></h4>
|
|
<p><b>Callback Function Prototype:</b></p>
|
|
<ul><pre>
|
|
void redraw(NXWINDOW hwnd, FAR const struct nxgl_rect_s *rect,
|
|
boolean more, FAR void *arg);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
NX requests that the client re-draw the portion of the window within
|
|
with rectangle.
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<ul><dl>
|
|
<dt><code>hwnd</code>
|
|
<dd>The handle created by <a href="#nxopenwindow"><code>nx_openwindow()</code></a>
|
|
or <a href="#nxrequestbkgd"><code>nx_requestbkgd()</code></a>
|
|
<dt><code>rect</code>
|
|
<dd>The rectangle that needs to be re-drawn (in window relative coordinates)
|
|
<dt><code>more</code>
|
|
<dd>TRUE: More re-draw requests will follow
|
|
<dt><code>arg</code>
|
|
<dd>User provided argument (see <a href="#nxopenwindow"><code>nx_openwindow()</code></a>)
|
|
</dl></ul>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b> None
|
|
</p>
|
|
|
|
<h4>2.3.3.2 <a name="nxcbposition"><code>position()</code></a></h4>
|
|
<p><b>Callback Function Prototype:</b></p>
|
|
<ul><pre>
|
|
void position(NXWINDOW hwnd, FAR const struct nxgl_size_s *size,
|
|
FAR const struct nxgl_point_s *pos,
|
|
FAR const struct nxgl_rect_s *bounds,
|
|
FAR void *arg);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
The size or position of the window has changed (or the window was
|
|
just created with zero size.
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<ul><dl>
|
|
<dt><code>hwnd</code>
|
|
<dd>The handle created by <a href="#nxopenwindow"><code>nx_openwindow()</code></a>
|
|
or <a href="#nxrequestbkgd"><code>nx_requestbkgd()</code></a>
|
|
<dt><code>size</code>
|
|
<dd>The size of the window
|
|
<dt><code>pos</code>
|
|
<dd>The position of the upper left hand corner of the window on
|
|
the overall display
|
|
<dt><code>bounds</code>
|
|
<dd>The bounding rectangle that the describes the entire display
|
|
<dt><code>arg</code>
|
|
<dd>User provided argument (see <a href="#nxopenwindow"><code>nx_openwindow()</code></a>)
|
|
</dl></ul>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b> None
|
|
</p>
|
|
|
|
<h4>2.3.3.3 <a name="nxcbmousein"><code>mousein()</code></a></h4>
|
|
<p><b>Callback Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#ifdef CONFIG_NX_MOUSE
|
|
void mousein(NXWINDOW hwnd, FAR const struct nxgl_point_s *pos,
|
|
ubyte buttons, FAR void *arg);
|
|
#endif
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
New mouse data is available for the window
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<ul><dl>
|
|
<dt><code>hwnd</code>
|
|
<dd>The handle created by <a href="#nxopenwindow"><code>nx_openwindow()</code></a>
|
|
or <a href="#nxrequestbkgd"><code>nx_requestbkgd()</code></a>
|
|
<dt><code>pos</code>
|
|
<dd>The (x,y) position of the mouse
|
|
<dt><code>buttons</code>
|
|
<dd>See <code>NX_MOUSE_*</code> definitions
|
|
<dt><code>arg</code>
|
|
<dd>User provided argument (see <a href="#nxopenwindow"><code>nx_openwindow()</code></a>)
|
|
</dl></ul>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b> None
|
|
</p>
|
|
|
|
<h4>2.3.3.4 <a name="nxcbkbdin"><code>kbdin()</code></a></h4>
|
|
<p><b>Callback Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#ifdef CONFIG_NX_KBD
|
|
void (*kbdin)(NXWINDOW hwnd, ubyte nch, FAR const ubyte *ch, FAR void *arg);
|
|
#endif
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
New keyboard/keypad data is available for the window.
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<ul><dl>
|
|
<dt><code>hwnd</code>
|
|
<dd>The handle created by <a href="#nxopenwindow"><code>nx_openwindow()</code></a>
|
|
or <a href="#nxrequestbkgd"><code>nx_requestbkgd()</code></a>
|
|
<dt><code>nch</code>
|
|
<dd>The number of characters that are available in ch[]
|
|
<dt><code>ch</code>
|
|
<dd>The array of characters
|
|
<dt><code>arg</code>
|
|
<dd>User provided argument (see <a href="#nxopenwindow"><code>nx_openwindow()</code></a>)
|
|
</dl></ul>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b> NOne
|
|
</p>
|
|
|
|
<h3>2.3.4 <a name="nxruninstance"><code>nx_runinstance()</code> (and <code>nx_run()<code> macro)</a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
|
|
#ifdef CONFIG_NX_MULTIUSER
|
|
int nx_runinstance(FAR const char *mqname, FAR struct fb_vtable_s *fb);
|
|
#define nx_run(fb) nx_runinstance(NX_DEFAULT_SERVER_MQNAME, fb)
|
|
#endif
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
This is the server entry point. It does not return; the calling thread
|
|
is dedicated to supporting NX server.
|
|
</p>
|
|
<p>
|
|
NOTE that multiple instances of the NX server may run at the same time,
|
|
with different callback and message queue names. <code>nx_run()</code> is simply
|
|
a macro that can be used when only one server instance is required. In
|
|
that case, a default server name is used.
|
|
</p>
|
|
<p>
|
|
Multiple user mode only!
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<ul><dl>
|
|
<dt><code>mqname</code>
|
|
<dd>
|
|
- The name for the server incoming message queue
|
|
<dt><code>fb</code>
|
|
<dd>Vtable "object" of the framebuffer "driver" to use
|
|
</dl></ul>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
This function usually does not return. If it does return, it will
|
|
return <code>ERROR</code> and <code>errno</code> will be set appropriately.
|
|
</p>
|
|
|
|
<h3>2.3.5 <a name="nxconnectinstance"><code>nx_connectinstance()</code> (and <code>nx_connect()</code> macro)</a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
|
|
#ifdef CONFIG_NX_MULTIUSER
|
|
NXHANDLE nx_connectinstance(FAR const char *svrmqname);
|
|
#define nx_connect(cb) nx_connectinstance(NX_DEFAULT_SERVER_MQNAME)
|
|
#endif
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Open a connection from a client to the NX server. One one client
|
|
connection is normally needed per thread as each connection can host
|
|
multiple windows.
|
|
</p>
|
|
<p>
|
|
NOTES:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
This function returns before the connection is fully instantiated.
|
|
it is necessary to wait for the connection event before using the
|
|
returned handle.
|
|
</li>
|
|
<li>
|
|
Multiple instances of the NX server may run at the same time,
|
|
each with different message queue names.
|
|
</li>
|
|
<li>
|
|
<code>nx_connect()</code> is simply a macro that can be used when only one
|
|
server instance is required. In that case, a default server name
|
|
is used.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
Multiple user mode only!
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<ul><dl>
|
|
<dt><code>svrmqname</code>
|
|
<dd>The name for the server incoming message queue
|
|
</dl></ul>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
</p>
|
|
<ul>
|
|
Success: A non-NULL handle used with subsequent NX accesses<br>
|
|
Failure: NULL is returned and <code>errno</code> is set appropriately.
|
|
</ul>
|
|
|
|
<h3>2.3.6 <a name="nxopen"><code>nx_open()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
|
|
#ifndef CONFIG_NX_MULTIUSER
|
|
NXHANDLE nx_open(FAR struct fb_vtable_s *fb);
|
|
#endif
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Create, initialize and return an NX handle for use in subsequent
|
|
NX API calls. <code>nx_open()</code> is the single user equivalent of
|
|
<a href="#nxconnectinstance"><code>nx_connect()</code></a> plus
|
|
<a href="#nxruninstance"><code>nx_run()</code></a>.
|
|
</p>
|
|
<p>
|
|
Single user mode only!
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<ul><dl>
|
|
<dt><code>fb</code>
|
|
<dd>Vtable "object" of the framebuffer "driver" to use
|
|
<dt><code>cb</code>
|
|
<dd>Callbacks used to process received NX server messages
|
|
</dl></ul>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
</p>
|
|
<ul>
|
|
Success: A non-NULL handle used with subsequent NX accesses<br>
|
|
Failure: NULL is returned and <code>errno</code> is set appropriately.
|
|
</ul>
|
|
|
|
<h3>2.3.7 <a name="nxdisconnect"><code>nx_disconnect()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
|
|
#ifdef CONFIG_NX_MULTIUSER
|
|
void nx_disconnect(NXHANDLE handle);
|
|
#endif
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Disconnect a client from the NX server and/or free resources reserved
|
|
by <a href="#nxconnectinstance"><code>nx_connect()</code>/<code>nx_connectinstance()</code></a>.
|
|
<code>nx_disconnect()</code> is muliti-user equivalent of
|
|
<a href="#nxclose"><code>nx_close()</code></a>.
|
|
</p>
|
|
<p>
|
|
Multiple user mode only!
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<ul><dl>
|
|
<dt><code>handle</code>
|
|
<dd>The handle returned by <a href="#nxconnectinstance"><code>nx_connect()</code></a>.
|
|
</dl></ul>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b> None.
|
|
</p>
|
|
|
|
<h3>2.3.8 <a name="nxclose"><code>nx_close()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
|
|
#ifndef CONFIG_NX_MULTIUSER
|
|
void nx_close(NXHANDLE handle);
|
|
#endif
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Close the single user NX interface. nx_close is single-user equivalent
|
|
of <a href="#nxdisconnect"><code>nx_disconnect()</code></a>.
|
|
</p>
|
|
<p>
|
|
Single user mode only!
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<ul><dl>
|
|
<dt><code>handle</code>
|
|
<dd>The handle returned by <a href="#nxopen"><code>nx_open()</code></a>.
|
|
</dl></ul>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b> None
|
|
</p>
|
|
|
|
<h3>2.3.9 <a name="nxeventhandler"><code>nx_eventhandler()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
|
|
#ifdef CONFIG_NX_MULTIUSER
|
|
int nx_eventhandler(NXHANDLE handle);
|
|
#else
|
|
# define nx_eventhandler(handle) (OK)
|
|
#endif
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
The client code must call this function periodically to process
|
|
incoming messages from the server. If <code>CONFIG_NX_BLOCKING</code> is defined,
|
|
then this function not return until a server message is received.
|
|
</p>
|
|
<p>
|
|
When <code>CONFIG_NX_BLOCKING</code> is not defined, the client must exercise
|
|
caution in the looping to assure that it does not eat up all of
|
|
the CPU bandwidth calling nx_eventhandler repeatedly.
|
|
<a href="#nxeventnotify"><code>nx_eventnotify()</code></a>
|
|
may be called to get a signal event whenever a new incoming server
|
|
event is avaiable.
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<ul><dl>
|
|
<dt><code>handle</code>
|
|
<dd>The handle returned by <a href="#nxconnectinstance"><code>nx_connect()</code></a>.
|
|
</dl></ul>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
<code>OK</code>: No errors occurred. If <code>CONFIG_NX_BLOCKING</code> is defined,
|
|
then one or more server messages were processed.
|
|
</li>
|
|
<li>
|
|
<code>ERROR</code>: An error occurred and <code>errno</code> has been set appropriately.
|
|
Of particular interest, it will return <code>errno == EHOSTDOWN</code> when the
|
|
server is disconnected. After that event, the handle can no longer be used.
|
|
</li>
|
|
</ul>
|
|
|
|
<h3>2.3.10 <a name="nxeventnotify"><code>nx_eventnotify()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
|
|
#if defined(CONFIG_NX_MULTIUSER) && !defined(CONFIG_DISABLE_SIGNALS)
|
|
int nx_eventnotify(NXHANDLE handle, int signo);
|
|
#else
|
|
# define nx_eventnotify(handle, signo) (OK)
|
|
#endif
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Rather than calling <a href="#nxeventhandler"><code>nx_eventhandler()</code></a> periodically,
|
|
the client may register to receive a signal when a server event is available.
|
|
The client can then call <a href="#nxeventhandler"><code>nv_eventhandler()</code></a> only when
|
|
incoming events are available.
|
|
</p>
|
|
<p>
|
|
The underlying implementation used <code>mq_notifiy()</code> and, as a result,
|
|
the client must observe the rules for using <code>mq_notifiy()</code>:
|
|
<ul>
|
|
<li>
|
|
Only one event is signaled. Upon receipt of the signal, if the client
|
|
wishes further notifications, it must call <code>nx_eventnotify()</code> again.
|
|
</li>
|
|
<li>
|
|
The signal will only be issued when the message queue transitions from empty to
|
|
not empty.
|
|
</li>
|
|
</ul>
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<ul><dl>
|
|
<dt><code>handle</code>
|
|
<dd>The handle returned by <a href="#nxconnectinstance"><code>nx_connect()</code></a>.
|
|
</dl></ul>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
<code>OK</code> on success;
|
|
<code>ERROR</code> on failure with <code>errno</code> set appropriately
|
|
</p>
|
|
|
|
<h3>2.3.11 <a name="nxopenwindow"><code>nx_openwindow()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
|
|
NXWINDOW nx_openwindow(NXHANDLE handle,
|
|
FAR const struct nx_callback_s *cb,
|
|
FAR void *arg);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b> Create a new window.
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<ul><dl>
|
|
<dt><code>handle</code>
|
|
<dd>The handle returned by <a href="#nxconnectinstance"><code>nx_connect()</code></a>
|
|
or <a href="#nxopen"><code>nx_open()</code></a>.
|
|
<dt><code>cb</code>
|
|
<dd>Callbacks used to process window events
|
|
<dt><code>arg</code>
|
|
<dd>User provided value that will be returned with NX callbacks.
|
|
</dl></ul>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
</p>
|
|
<ul>
|
|
Success: A non-NULL handle used with subsequent NX accesses<br>
|
|
Failure: NULL is returned and <code>errno</code> is set appropriately.
|
|
</ul>
|
|
|
|
<h3>2.3.12 <a name="nxclosewindow"><code>nx_closewindow()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
|
|
int nx_closewindow(NXWINDOW hwnd);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Destroy a window created by <a href="#nxopenwindow"><code>nx_openwindow()</code></a> window.
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<ul><dl>
|
|
<dt><code>hwnd</code>
|
|
<dd>The handle returned by <a href="#nxopenwindow"><code>nx_openwindow()</code></a>
|
|
that identifies the window to be destroyed.
|
|
This handle must not have been one returned by
|
|
<a href="#nxrequestbkgd"><code>nx_requestbkgd()</code></a>.
|
|
</dl></ul>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
<code>OK</code> on success;
|
|
<code>ERROR</code> on failure with <code>errno</code> set appropriately
|
|
</p>
|
|
|
|
<h3>2.3.13 <a name="nxrequestbkgd"><code>nx_requestbkgd()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
|
|
int nx_requestbkgd(NXHANDLE handle,
|
|
FAR const struct nx_callback_s *cb,
|
|
FAR void *arg);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
NX normally controls a separate window called the background window.
|
|
It repaints the window as necessary using only a solid color fill. The
|
|
background window always represents the entire screen and is always
|
|
below other windows. It is useful for an application to control the
|
|
background window in the following conditions:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
If you want to implement a windowless solution. The single screen
|
|
can be used to creat a truly simple graphic environment. In this
|
|
case, you should probably also de-select <code>CONFIG_NX_MULTIUSER</code> as well.
|
|
</li>
|
|
<li>
|
|
When you want more on the background than a solid color. For
|
|
example, if you want an image in the background, or animations in the
|
|
background, or live video, etc.
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
This API only requests the handle of the background window. That
|
|
handle will be returned asynchronously in a subsequent position and
|
|
redraw callbacks.
|
|
</p>
|
|
<p>
|
|
Cautions:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
The following should never be called using the background window.
|
|
They are guaranteed to cause severe crashes:
|
|
<a href="#nxsetposition"><code>nx_setposition()</code></a>,
|
|
<a href="#nxsetsize"><code>nx_setsize()</code></a>,
|
|
<a href="#nxraise"><code>nx_raise()</code></a>, or
|
|
<a href="#nxlower"><code>nx_lower()</code></a>.
|
|
</li>
|
|
<li>
|
|
Neither <code>nx_requestbkgd()</code> nor
|
|
<a href="#nxreleasebkgd"><code>nx_releasebkgd ()</code></a> should be called more than once.
|
|
Multiple instances of the background window are not supported.
|
|
</li>
|
|
</ul>
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<ul><dl>
|
|
<dt><code>handle</code>
|
|
<dd>The handle returned by <a href="#nxconnectinstance"><code>nx_connect()</code></a>
|
|
or <a href="#nxopen"><code>nx_open()</code></a>.
|
|
<dt><code>cb</code>
|
|
<dd>Callbacks to use for processing background window events
|
|
<dt><code>arg</code>
|
|
<dd>User provided argument (see <a href="#nxopenwindow"><code>nx_openwindow()</code></a>)
|
|
</dl></ul>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
<code>OK</code> on success;
|
|
<code>ERROR</code> on failure with <code>errno</code> set appropriately
|
|
</p>
|
|
|
|
<h3>2.3.14 <a name="nxreleasebkgd"><code>nx_releasebkgd()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
|
|
int nx_releasebkgd(NXWINDOW hwnd);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Release the background window previously acquired using
|
|
<a href="#nxrequestbkgd"><code>nx_requestbkgd()</code></a>
|
|
and return control of the background to NX.
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<ul><dl>
|
|
<dt><code>handle</code>
|
|
<dd>The handle returned indirectly by
|
|
<a href="#nxrequestbkgd"><code>nx_requestbkgd()</code></a>.
|
|
This handle must not have been one created by
|
|
<a href="#nxopenwindow"><code>nx_openwindow()</code></a>.
|
|
</dl></ul>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
<code>OK</code> on success;
|
|
<code>ERROR</code> on failure with <code>errno</code> set appropriately
|
|
</p>
|
|
|
|
<h3>2.3.15 <a name="nxgetposition"><code>nx_getposition()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
|
|
int nx_getposition(NXWINDOW hwnd);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Request the position and size information for the selected window. The
|
|
values will be return asynchronously through the client callback function
|
|
pointer.
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<ul><dl>
|
|
<dt><code>hwnd</code>
|
|
<dd>The handle returned by <a href="#nxopenwindow"><code>nx_openwindow()</code></a> or
|
|
<a href="#nxrequestbkgd"><code>nx_requestbkgd()</code></a>.
|
|
</dl></ul>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
<code>OK</code> on success;
|
|
<code>ERROR</code> on failure with <code>errno</code> set appropriately
|
|
</p>
|
|
|
|
<h3>2.3.16 <a name="nxsetposition"><code>nx_setposition()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
|
|
int nx_setposition(NXWINDOW hwnd, FAR struct nxgl_point_s *pos);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Set the position and size for the selected window.
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<ul><dl>
|
|
<dt><code>hwnd</code>
|
|
<dd>The handle returned by <a href="#nxopenwindow"><code>nx_openwindow()</code></a>.
|
|
This handle must not have been created by
|
|
<a href="#nxrequestbkgd"><code>nx_requestbkgd()</code></a>.
|
|
<dt><code>pos</code>
|
|
<dd>The new position of the window
|
|
</dl></ul>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
<code>OK</code> on success;
|
|
<code>ERROR</code> on failure with <code>errno</code> set appropriately
|
|
</p>
|
|
|
|
<h3>2.3.17 <a name="nxsetsize"><code>nx_setsize()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
|
|
int nx_setsize(NXWINDOW hwnd, FAR struct nxgl_size_s *size);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b> Set the size of the selected window.
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<ul><dl>
|
|
<dt><code>hwnd</code>
|
|
<dd>The handle returned by <a href="#nxopenwindow"><code>nx_openwindow()</code></a>.
|
|
This handle must not have been created by
|
|
<a href="#nxrequestbkgd"><code>nx_requestbkgd()</code></a>.
|
|
<dt><code>size</code>
|
|
<dd>The new size of the window (in pixels).
|
|
</dl></ul>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
<code>OK</code> on success;
|
|
<code>ERROR</code> on failure with <code>errno</code> set appropriately
|
|
</p>
|
|
|
|
<h3>2.3.18 <a name="nxraise"><code>nx_raise()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
|
|
int nx_raise(NXWINDOW hwnd);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b> Bring the specified window to the top of the display.
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<ul><dl>
|
|
<dt><code>hwnd</code>
|
|
<dd>The handle returned by <a href="#nxopenwindow"><code>nx_openwindow()</code></a>.
|
|
This handle must not have been created by
|
|
<a href="#nxrequestbkgd"><code>nx_requestbkgd()</code></a>.
|
|
<dt><code></code>
|
|
<dd>
|
|
</dl></ul>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
<code>OK</code> on success;
|
|
<code>ERROR</code> on failure with <code>errno</code> set appropriately
|
|
</p>
|
|
|
|
<h3>2.3.19 <a name="nxlower"><code>nx_lower()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
|
|
int nx_lower(NXWINDOW hwnd);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b> Lower the specified window to the bottom of the display.
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<ul><dl>
|
|
<dt><code>hwnd</code>
|
|
<dd>The handle returned by <a href="#nxopenwindow"><code>nx_openwindow()</code></a>.
|
|
This handle must not have been created by
|
|
<a href="#nxrequestbkgd"><code>nx_requestbkgd()</code></a>.
|
|
<dt><code></code>
|
|
<dd>
|
|
</dl></ul>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
<code>OK</code> on success;
|
|
<code>ERROR</code> on failure with <code>errno</code> set appropriately
|
|
</p>
|
|
|
|
<h3>2.3.20 <a name="nxfill"><code>nx_fill()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
|
|
int nx_fill(NXWINDOW hwnd, FAR const struct nxgl_rect_s *rect,
|
|
nxgl_mxpixel_t color[CONFIG_NX_NPLANES]);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Fill the specified rectangle in the window with the specified color.
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<ul><dl>
|
|
<dt><code>hwnd</code>
|
|
<dd>The handle returned by <a href="#nxopenwindow"><code>nx_openwindow()</code></a>
|
|
or <a href="#nxrequestbkgd"><code>nx_requestbkgd()</code></a>
|
|
<dt><code>rect</code>
|
|
<dd>The location to be filled
|
|
<dt><code>color</code>
|
|
<dd>The color to use in the fill
|
|
</dl></ul>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
<code>OK</code> on success;
|
|
<code>ERROR</code> on failure with <code>errno</code> set appropriately
|
|
</p>
|
|
|
|
<h3>2.3.21 <a name="nxfilltrapezoid"><code>nx_filltrapezoid()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
|
|
int nx_filltrapezoid(NXWINDOW hwnd, FAR const struct nxgl_rect_s *clip,
|
|
FAR const struct nxgl_trapezoid_s *trap,
|
|
nxgl_mxpixel_t color[CONFIG_NX_NPLANES]);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Fill the specified trapezoidal region in the window with the specified color.
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<ul><dl>
|
|
<dt><code>hwnd</code>
|
|
<dd>The handle returned by <a href="#nxopenwindow"><code>nx_openwindow()</code></a>
|
|
or <a href="#nxrequestbkgd"><code>nx_requestbkgd()</code></a>
|
|
<dt><code>clip</code>
|
|
<dd>Clipping rectangle relative to window (may be null)
|
|
<dt><code>trap</code>
|
|
<dd>The trapezoidal region to be filled
|
|
<dt><code>color</code>
|
|
<dd>The color to use in the fill
|
|
</dl></ul>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
<code>OK</code> on success;
|
|
<code>ERROR</code> on failure with <code>errno</code> set appropriately
|
|
</p>
|
|
|
|
<h3>2.3.22 <a name="nxglrgb2yuv"><code>nx_setbgcolor()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
|
|
int nx_setbgcolor(NXHANDLE handle,
|
|
nxgl_mxpixel_t color[CONFIG_NX_NPLANES]);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b> Set the color of the background.
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<ul><dl>
|
|
<dt><code>handle</code>
|
|
<dd>The handle created by <a href="#nxopenwindow"><code>nx_openwindow()</code></a>
|
|
or <a href="#nxrequestbkgd"><code>nx_requestbkgd()</code></a>
|
|
<dt><code>color</code>
|
|
<dd>The color to use in the background
|
|
</dl></ul>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
<code>OK</code> on success;
|
|
<code>ERROR</code> on failure with <code>errno</code> set appropriately
|
|
</p>
|
|
|
|
<h3>2.3.23 <a name="nxmove"><code>nx_move()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
|
|
int nx_move(NXWINDOW hwnd, FAR const struct nxgl_rect_s *rect,
|
|
FAR const struct nxgl_point_s *offset);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b> Move a rectangular region within the window.
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<ul><dl>
|
|
<dt><code>hwnd</code>
|
|
<dd>The handle returned by <a href="#nxopenwindow"><code>nx_openwindow()</code></a>
|
|
or <a href="#nxrequestbkgd"><code>nx_requestbkgd()</code></a> that specifies
|
|
the window within which the move is to be done
|
|
<dt><code>rect</code>
|
|
<dd>Describes the (source) rectangular region to move
|
|
<dt><code>offset</code>
|
|
<dd>The offset to move the region
|
|
</dl></ul>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
<code>OK</code> on success;
|
|
<code>ERROR</code> on failure with <code>errno</code> set appropriately
|
|
</p>
|
|
|
|
<h3>2.3.24 <a name="nxbitmap"><code>nx_bitmap()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
|
|
int nx_bitmap(NXWINDOW hwnd, FAR const struct nxgl_rect_s *dest,
|
|
FAR const void *src[CONFIG_NX_NPLANES],
|
|
FAR const struct nxgl_point_s *origin,
|
|
unsigned int stride);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Copy a rectangular region of a larger image into the rectangle in the
|
|
specified window.
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<ul><dl>
|
|
<dt><code>hwnd</code>
|
|
<dd>The handle returned by <a href="#nxopenwindow"><code>nx_openwindow()</code></a>
|
|
or <a href="#nxrequestbkgd"><code>nx_requestbkgd()</code></a> that specifies the
|
|
window that will receive the bitmap image.
|
|
<dt><code>dest</code>
|
|
<dd> Describes the rectangular on the display that will receive the the bit map.
|
|
<dt><code>src</code>
|
|
<dd>The start of the source image. This is an array source images of size
|
|
<code>CONFIG_NX_NPLANES</code> (probably 1).
|
|
<dt><code>origin</code>
|
|
<dd>The origin of the upper, left-most corner of the full bitmap.
|
|
Both dest and origin are in window coordinates, however, the origin
|
|
may lie outside of the display.
|
|
<dt><code>stride</code>
|
|
<dd>The width of the full source image in bytes.
|
|
</dl></ul>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
<code>OK</code> on success;
|
|
<code>ERROR</code> on failure with <code>errno</code> set appropriately
|
|
</p>
|
|
|
|
<h3>2.3.25 <a name="nxkbdin"><code>nx_kbdin()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
|
|
#ifdef CONFIG_NX_KBD
|
|
int nx_kbdchin(NXHANDLE handle, ubyte ch);
|
|
int nx_kbdin(NXHANDLE handle, ubyte nch, FAR const ubyte *ch);
|
|
#endif
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Used by a thread or interrupt handler that manages some kind of keypad
|
|
hardware to report text information to the NX server. That text
|
|
data will be routed by the NX server to the appropriate window client.
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
<code>OK</code> on success;
|
|
<code>ERROR</code> on failure with <code>errno</code> set appropriately
|
|
</p>
|
|
|
|
<h3>2.3.26 <a name="nxmousein"><code>nx_mousein()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
|
|
#ifdef CONFIG_NX_MOUSE
|
|
int nx_mousein(NXHANDLE handle, nxgl_coord_t x, nxgl_coord_t y, ubyte buttons);
|
|
#endif
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Used by a thread or interrupt handler that manages some kind of pointing
|
|
hardware to report new positional data to the NX server. That positional
|
|
data will be routed by the NX server to the appropriate window client.
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<ul><dl>
|
|
<dt><code></code>
|
|
<dd>
|
|
</dl></ul>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
<code>OK</code> on success;
|
|
<code>ERROR</code> on failure with <code>errno</code> set appropriately
|
|
</p>
|
|
|
|
<h2>2.4 <a name="nxtk2">NX Tool Kit (<code>NXTK</code>)</a></h2>
|
|
|
|
<p>
|
|
NXTK implements where the <i>framed window</i>.
|
|
NX framed windows consist of three components within one NX window:
|
|
</p>
|
|
<ol>
|
|
<li>The window <i>border</i>,</li>
|
|
<li>The main <i>client window</i> area, and</li>
|
|
<li>A <i>toolbar</i> area</li>
|
|
</ol>
|
|
|
|
<p>
|
|
Each sub-window represents a region within one window.
|
|
<a href="#screenshot">Figure 1</a> shows some simple NX framed windows.
|
|
NXTK allows these sub-windows to be managed more-or-less independently:
|
|
</p>
|
|
<ul>
|
|
<li>
|
|
Each component has its own callbacks for redraw and position events
|
|
as well as mouse and keyboard inputs.
|
|
The client sub-window callbacks are registered when the framed window is
|
|
created with a call to <a href="#nxtkopenwindow"><code>nxtk_openwindow()</code></a>;
|
|
Separate toolbar sub-window callbakcs are reigistered when the toolbar
|
|
is added using <a href="#nxtkopentoolbar"><code>nxtk_opentoolbar()</code></a>.
|
|
(NOTES: (1) only the client sub-window receives keyboard input and,
|
|
(2) border callbacks are not currently accessible by the user).
|
|
<li>
|
|
</li>
|
|
All position informational provided within the callback is relative
|
|
to the specific sub-window.
|
|
That is, the origin (0,0) of the coordinate system for each sub-window
|
|
begins at the top left corner of the subwindow.
|
|
This means that toolbar logic need not be concerned about client window
|
|
geometry (and vice versa) and, for example, common toolbar logic can
|
|
be used with different windows.
|
|
</li>
|
|
</ul>
|
|
|
|
<h3>2.4.1 <a name="nxtktypes"><code>NXTK Types()</code></a></h3>
|
|
|
|
<p>
|
|
This is the handle that can be used to access the window data region.
|
|
</p>
|
|
<ul><pre>
|
|
typedef FAR void *NXTKWINDOW;
|
|
</pre></ul>
|
|
|
|
<h3>2.4.2 <a name="nxtkopenwindow"><code>nxtk_openwindow()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
#include <nuttx/nxtk.h>
|
|
|
|
NXTKWINDOW nxtk_openwindow(NXHANDLE handle,
|
|
FAR const struct nx_callback_s *cb,
|
|
FAR void *arg);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b> Create a new, framed window.
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<dl>
|
|
<dt><code>handle</code>
|
|
<dd>The handle returned by <a href="#nxconnectinstance"><code>nx_connect()</code></a>
|
|
or <a href="#nxopen"><code>nx_open()</code></a>.
|
|
<dt><code>cb</code>
|
|
<dd>Callbacks used to process window events
|
|
<dt><code>arg</code>
|
|
<dd>User provided argument (see <a href="#nxopenwindow"><code>nx_openwindow()</code></a>)
|
|
</dl>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
</p>
|
|
<ul>
|
|
Success: A non-NULL handle used with subsequent NXTK window accesses<br>
|
|
Failure: NULL is returned and <code>errno</code> is set appropriately.
|
|
</ul>
|
|
|
|
<h3>2.4.3 <a name="nxtkclosewindow"><code>nxtk_closewindow()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
#include <nuttx/nxtk.h>
|
|
|
|
int nxtk_closewindow(NXTKWINDOW hfwnd);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Close the window opened by <a href="#nxtkopenwindow"><code>nxtk_openwindow()</code></a>.
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<dl>
|
|
<dt><code>hfwnd</code>
|
|
<dd>A handle previously returned by
|
|
<a href="#nxtkopenwindow"><code>nxtk_openwindow()</code></a>.
|
|
</dl>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
<code>OK</code> on success;
|
|
<code>ERROR</code> on failure with <code>errno</code> set appropriately
|
|
</p>
|
|
|
|
<h3>2.4.4 <a name="nxtkgetposition"><code>nxtk_getposition()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
#include <nuttx/nxtk.h>
|
|
|
|
int nxtk_getposition(NXTKWINDOW hfwnd);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Request the position and size information for the selected framed window.
|
|
The size/position for the client window and toolbar will be return
|
|
asynchronously through the client callback function pointer.
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<dl>
|
|
<dt><code>hfwnd</code>
|
|
<dd>A handle previously returned by
|
|
<a href="#nxtkopenwindow"><code>nxtk_openwindow()</code></a>.
|
|
</dl>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
<code>OK</code> on success;
|
|
<code>ERROR</code> on failure with <code>errno</code> set appropriately
|
|
</p>
|
|
|
|
<h3>2.4.5 <a name="nxtksetposition"><code>nxtk_setposition()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
#include <nuttx/nxtk.h>
|
|
|
|
int nxtk_setposition(NXTKWINDOW hfwnd, FAR struct nxgl_point_s *pos);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Set the position for the selected client window. This position does not
|
|
include the offsets for the borders nor for any toolbar. Those offsets
|
|
will be added in to set the full window position.
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<dl>
|
|
<dt><code>hfwnd</code>
|
|
<dd>A handle previously returned by
|
|
<a href="#nxtkopenwindow"><code>nxtk_openwindow()</code></a>.
|
|
<dt><code>pos</code>
|
|
<dd>The new position of the client sub-window
|
|
</dl>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
<code>OK</code> on success;
|
|
<code>ERROR</code> on failure with <code>errno</code> set appropriately
|
|
</p>
|
|
|
|
<h3>2.4.6 <a name="nxtksetsize"><code>nxtk_setsize()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
#include <nuttx/nxtk.h>
|
|
|
|
int nxtk_setsize(NXTKWINDOW hfwnd, FAR struct nxgl_size_s *size);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Set the size for the selected client window. This size does not
|
|
include the sizes of the borders nor for any toolbar. Those sizes
|
|
will be added in to set the full window size.
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<dl>
|
|
<dt><code>hfwnd</code>
|
|
<dd>A handle previously returned by
|
|
<a href="#nxtkopenwindow"><code>nxtk_openwindow()</code></a>.
|
|
<dt><code>size</code>
|
|
<dd>The new size of the client sub-window.
|
|
</dl>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
<code>OK</code> on success;
|
|
<code>ERROR</code> on failure with <code>errno</code> set appropriately
|
|
</p>
|
|
|
|
<h3>2.4.7 <a name="nxtkraise"><code>nxtk_raise()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
#include <nuttx/nxtk.h>
|
|
|
|
int nxtk_raise(NXTKWINDOW hfwnd);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Bring the window containing the specified client sub-window to the top
|
|
of the display.
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<dl>
|
|
<dt><code>hfwnd</code>
|
|
<dd>A handle previously returned by
|
|
<a href="#nxtkopenwindow"><code>nxtk_openwindow()</code></a>
|
|
specifying the window to be raised.
|
|
<dt><code></code>
|
|
<dd>
|
|
</dl>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
<code>OK</code> on success;
|
|
<code>ERROR</code> on failure with <code>errno</code> set appropriately
|
|
</p>
|
|
|
|
<h3>2.4.8 <a name="nxtklower"><code>nxtk_lower()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
#include <nuttx/nxtk.h>
|
|
|
|
int nxtk_lower(NXTKWINDOW hfwnd);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Lower the window containing the specified client sub-window to the
|
|
bottom of the display.
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<dl>
|
|
<dt><code>hfwnd</code>
|
|
<dd>A handle previously returned by
|
|
<a href="#nxtkopenwindow"><code>nxtk_openwindow()</code></a>
|
|
specifying the window to be lowered.
|
|
<dt><code></code>
|
|
<dd>
|
|
</dl>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
<code>OK</code> on success;
|
|
<code>ERROR</code> on failure with <code>errno</code> set appropriately
|
|
</p>
|
|
|
|
<h3>2.4.9 <a name="nxtkfillwindow"><code>nxtk_fillwindow()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
#include <nuttx/nxtk.h>
|
|
|
|
int nxtk_fillwindow(NXTKWINDOW hfwnd, FAR const struct nxgl_rect_s *rect,
|
|
nxgl_mxpixel_t color[CONFIG_NX_NPLANES]);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Fill the specified rectangle in the client window with the specified color.
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<dl>
|
|
<dt><code>hfwnd</code>
|
|
<dd>A handle previously returned by
|
|
<a href="#nxtkopenwindow"><code>nxtk_openwindow()</code></a>.
|
|
<dt><code>rect</code>
|
|
<dd>The location within the client window to be filled
|
|
<dt><code>color</code>
|
|
<dd>The color to use in the fill
|
|
</dl>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
<code>OK</code> on success;
|
|
<code>ERROR</code> on failure with <code>errno</code> set appropriately
|
|
</p>
|
|
|
|
<h3>2.4.10 <a name="nxtkfilltrapwindow"><code>nxtk_filltrapwindow()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
#include <nuttx/nxtk.h>
|
|
|
|
int nxtk_filltrapwindow(NXTKWINDOW hfwnd,
|
|
FAR const struct nxgl_trapezoid_s *trap,
|
|
nxgl_mxpixel_t color[CONFIG_NX_NPLANES]);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Fill the specified trapezoid in the client window with the specified color
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<dl>
|
|
<dt><code>hfwnd</code>
|
|
<dd>A handle previously returned by
|
|
<a href="#nxtkopenwindow"><code>nxtk_openwindow()</code></a>.
|
|
<dt><code>trap</code>
|
|
<dd>The trapezoidal region to be filled.
|
|
<dt><code>color</code>
|
|
<dd>The color to use in the fill.
|
|
</dl>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
<code>OK</code> on success;
|
|
<code>ERROR</code> on failure with <code>errno</code> set appropriately
|
|
</p>
|
|
|
|
<h3>2.4.11 <a name="nxtkmovewindow"><code>nxtk_movewindow()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
#include <nuttx/nxtk.h>
|
|
|
|
int nxtk_movewindow(NXTKWINDOW hfwnd, FAR const struct nxgl_rect_s *rect,
|
|
FAR const struct nxgl_point_s *offset);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Move a rectangular region within the client sub-window of a framed window.
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<dl>
|
|
<dt><code>hfwnd</code>
|
|
<dd>A handle previously returned by
|
|
<a href="#nxtkopenwindow"><code>nxtk_openwindow()</code></a>
|
|
specifying the client sub-window within which the move is to be done.
|
|
<dt><code>rect</code>
|
|
<dd>Describes the rectangular region relative to the client sub-window to move.
|
|
<dt><code>offset</code>
|
|
<dd>The offset to move the region
|
|
</dl>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
<code>OK</code> on success;
|
|
<code>ERROR</code> on failure with <code>errno</code> set appropriately
|
|
</p>
|
|
|
|
<h3>2.4.12 <a name="nxtkbitmapwindow"><code>nxtk_bitmapwindow()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
#include <nuttx/nxtk.h>
|
|
|
|
int nxtk_bitmapwindow(NXTKWINDOW hfwnd,
|
|
FAR const struct nxgl_rect_s *dest,
|
|
FAR const void *src[CONFIG_NX_NPLANES],
|
|
FAR const struct nxgl_point_s *origin,
|
|
unsigned int stride);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Copy a rectangular region of a larger image into the rectangle in the
|
|
specified client sub-window.
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<dl>
|
|
<dt><code>hfwnd</code>
|
|
<dd>A handle previously returned by
|
|
<a href="#nxtkopenwindow"><code>nxtk_openwindow()</code></a>
|
|
specifying the client sub-window that will receive the bitmap.
|
|
<dt><code>dest</code>
|
|
<dd>Describes the rectangular region on in the client sub-window
|
|
will receive the bit map.
|
|
<dt><code>src</code>
|
|
<dd>The start of the source image(s). This is an array source
|
|
images of size <code>CONFIG_NX_NPLANES</code> (probably 1).
|
|
<dt><code>origin</code>
|
|
<dd>The origin of the upper, left-most corner of the full bitmap.
|
|
Both dest and origin are in sub-window coordinates, however, the
|
|
origin may lie outside of the sub-window display.
|
|
<dt><code>stride</code>
|
|
<dd>The width of the full source image in pixels.
|
|
</dl>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
<code>OK</code> on success;
|
|
<code>ERROR</code> on failure with <code>errno</code> set appropriately
|
|
</p>
|
|
|
|
<h3>2.4.13 <a name="nxtkopentoolbar"><code>nxtk_opentoolbar()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
#include <nuttx/nxtk.h>
|
|
|
|
int nxtk_opentoolbar(NXTKWINDOW hfwnd, nxgl_coord_t height,
|
|
FAR const struct nx_callback_s *cb,
|
|
FAR void *arg);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Create a tool bar at the top of the specified framed window.
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<dl>
|
|
<dt><code>hfwnd</code>
|
|
<dd>A handle previously returned by
|
|
<a href="#nxtkopenwindow"><code>nxtk_openwindow()</code></a>.
|
|
<dt><code>height</code>
|
|
<dd>The requested height of the toolbar in pixels.
|
|
<dt><code>cb</code>
|
|
<dd>Callbacks used to process toolbar events.
|
|
<dt><code>arg</code>
|
|
<dd>User provided value that will be returned with toolbar callbacks.
|
|
</dl>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
<code>OK</code> on success;
|
|
<code>ERROR</code> on failure with <code>errno</code> set appropriately
|
|
</p>
|
|
|
|
<h3>2.4.14 <a name="nxtkclosetoolbar"><code>nxtk_closetoolbar()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
#include <nuttx/nxtk.h>
|
|
|
|
int nxtk_closetoolbar(NXTKWINDOW hfwnd);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Remove the tool bar at the top of the specified framed window.
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<dl>
|
|
<dt><code>hfwnd</code>
|
|
<dd>A handle previously returned by
|
|
<a href="#nxtkopenwindow"><code>nxtk_openwindow()</code></a>.
|
|
<dt><code></code>
|
|
<dd>
|
|
</dl>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
<code>OK</code> on success;
|
|
<code>ERROR</code> on failure with <code>errno</code> set appropriately
|
|
</p>
|
|
|
|
<h3>2.4.15 <a name="nxtkfilltoolbar"><code>nxtk_filltoolbar()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
#include <nuttx/nxtk.h>
|
|
|
|
int nxtk_filltoolbar(NXTKWINDOW hfwnd, FAR const struct nxgl_rect_s *rect,
|
|
nxgl_mxpixel_t color[CONFIG_NX_NPLANES]);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Fill the specified rectangle in the toolbar sub-window with the specified color.
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<dl>
|
|
<dt><code>hfwnd</code>
|
|
<dd>A handle previously returned by
|
|
<a href="#nxtkopenwindow"><code>nxtk_openwindow()</code></a>.
|
|
<dt><code>rect</code>
|
|
<dd>The location within the toolbar window to be filled.
|
|
<dt><code>color</code>
|
|
<dd>The color to use in the fill.
|
|
</dl>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
<code>OK</code> on success;
|
|
<code>ERROR</code> on failure with <code>errno</code> set appropriately
|
|
</p>
|
|
|
|
<h3>2.4.16 <a name="nxtkfilltraptoolbar"><code>nxtk_filltraptoolbar()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
#include <nuttx/nxtk.h>
|
|
|
|
int nxtk_filltraptoolbar(NXTKWINDOW hfwnd, FAR const struct nxgl_trapezoid_s *trap,
|
|
nxgl_mxpixel_t color[CONFIG_NX_NPLANES]);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Fill the specified trapezoid in the toolbar sub-window with the specified color.
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<dl>
|
|
<dt><code>hfwnd</code>
|
|
<dd>A handle previously returned by
|
|
<a href="#nxtkopenwindow"><code>nxtk_openwindow()</code></a>.
|
|
<dt><code>trap</code>
|
|
<dd>The trapezoidal region to be filled
|
|
<dt><code>color</code>
|
|
<dd>The color to use in the fill
|
|
</dl>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
<code>OK</code> on success;
|
|
<code>ERROR</code> on failure with <code>errno</code> set appropriately
|
|
</p>
|
|
|
|
<h3>2.4.17 <a name="nxtkmovetoolbar"><code>nxtk_movetoolbar()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
#include <nuttx/nxtk.h>
|
|
|
|
int nxtk_movetoolbar(NXTKWINDOW hfwnd, FAR const struct nxgl_rect_s *rect,
|
|
FAR const struct nxgl_point_s *offset);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Move a rectangular region within the toolbar sub-window of a framed window.
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<dl>
|
|
<dt><code>hfwnd</code>
|
|
<dd>A handle identifying sub-window containing the toolbar within which the move is
|
|
to be done.
|
|
This handle must have previously been returned by
|
|
<a href="#nxtkopenwindow"><code>nxtk_openwindow()</code></a>.
|
|
<dt><code>rect</code>
|
|
<dd>Describes the rectangular region relative to the toolbar sub-window to move.
|
|
<dt><code>offset</code>
|
|
<dd>The offset to move the region
|
|
</dl>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
<code>OK</code> on success;
|
|
<code>ERROR</code> on failure with <code>errno</code> set appropriately
|
|
</p>
|
|
|
|
<h3>2.4.18 <a name="nxtkbitmaptoolbar"><code>nxtk_bitmaptoolbar()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nx.h>
|
|
#include <nuttx/nxtk.h>
|
|
|
|
int nxtk_bitmaptoolbar(NXTKWINDOW hfwnd,
|
|
FAR const struct nxgl_rect_s *dest,
|
|
FAR const void *src[CONFIG_NX_NPLANES],
|
|
FAR const struct nxgl_point_s *origin,
|
|
unsigned int stride);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Copy a rectangular region of a larger image into the rectangle in the
|
|
specified toolbar sub-window.
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<dl>
|
|
<dt><code>hfwnd</code>
|
|
<dd>A handle previously returned by
|
|
<a href="#nxtkopenwindow"><code>nxtk_openwindow()</code></a>.
|
|
<dt><code>dest</code>
|
|
<dd>Describes the rectangular region on in the toolbar sub-window
|
|
will receive the bit map.
|
|
<dt><code>src</code>
|
|
<dd>The start of the source image.
|
|
<dt><code>origin</code>
|
|
<dd>The origin of the upper, left-most corner of the full bitmap.
|
|
Both dest and origin are in sub-window coordinates, however, the
|
|
origin may lie outside of the sub-window display.
|
|
<dt><code>stride</code>
|
|
<dd>The width of the full source image in bytes.
|
|
</dl>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
<code>OK</code> on success;
|
|
<code>ERROR</code> on failure with <code>errno</code> set appropriately
|
|
</p>
|
|
|
|
<h2>2.5 <a name="nxfonts2">NX Fonts Support (<code>NXFONTS</code>)</a></h2>
|
|
|
|
<h3>2.5.1 <a name="nxfontstypes"><code>NXFONTS Types()</code></a></h3>
|
|
<p>
|
|
This structures provides the metrics for one glyph:
|
|
</p>
|
|
<ul><pre>
|
|
struct nx_fontmetic_s
|
|
{
|
|
uint32 stride : 2; /* Width of one font row in bytes */
|
|
uint32 width : 6; /* Width of the font in bits */
|
|
uint32 height : 6; /* Height of the font in rows */
|
|
uint32 xoffset : 6; /* Top, left-hand corner X-offset in pixels */
|
|
uint32 yoffset : 6; /* Top, left-hand corner y-offset in pixels */
|
|
uint32 unused : 6;
|
|
};
|
|
</pre></ul>
|
|
|
|
<p>
|
|
This structure binds the glyph metrics to the glyph bitmap:
|
|
</p>
|
|
<ul><pre>
|
|
struct nx_fontbitmap_s
|
|
{
|
|
struct nx_fontmetic_s metric; /* Character metrics */
|
|
FAR const ubyte *bitmap; /* Pointer to the character bitmap */
|
|
};
|
|
</pre></ul>
|
|
|
|
<p>
|
|
This structure describes one contiguous grouping of glyphs that
|
|
can be described by an array starting with encoding <code>first</code> and
|
|
extending through (<code>first</code> + <code>nchars</code> - 1).
|
|
</p>
|
|
<ul><pre>
|
|
struct nx_fontset_s
|
|
{
|
|
ubyte first; /* First bitmap character code */
|
|
ubyte nchars; /* Number of bitmap character codes */
|
|
FAR const struct nx_fontbitmap_s *bitmap;
|
|
};
|
|
</pre></ul>
|
|
|
|
<p>
|
|
This structure describes the overall fontset:
|
|
</p>
|
|
<ul><pre>
|
|
struct nx_font_s
|
|
{
|
|
ubyte mxheight; /* Max height of one glyph in rows */
|
|
ubyte mxwidth; /* Max width of any glyph in pixels */
|
|
ubyte mxbits; /* Max number of bits per character code */
|
|
ubyte spwidth; /* The width of a space in pixels */
|
|
};
|
|
</pre></ul>
|
|
|
|
<h3>2.5.2 <a name="nxfgetfontset"><code>nxf_getfontset()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nxfonts.h>
|
|
|
|
FAR const struct nx_font_s *nxf_getfontset(void);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Return information about the current font set.
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b> None
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
An instance of <code>struct nx_font_s</code> describing the font set.
|
|
</p>
|
|
|
|
<h3>2.5.3 <a name="nxfgetbitmap"><code>nxf_getbitmap()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nxfonts.h>
|
|
|
|
FAR const struct nx_fontbitmap_s *nxf_getbitmap(uint16 ch);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b>
|
|
Return font bitmap information for the selected character encoding.
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<ul><dl>
|
|
<dt><code></code>
|
|
<dd>
|
|
</dl></ul>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
An instance of <code>struct nx_fontbitmap_s</code> describing the glyph.
|
|
</p>
|
|
|
|
<h3>2.5.4 <a name="nxfconvertbpp"><code>nxf_convert_*bpp()</code></a></h3>
|
|
<p><b>Function Prototype:</b></p>
|
|
<ul><pre>
|
|
#include <nuttx/nxglib.h>
|
|
#include <nuttx/nxfonts.h>
|
|
|
|
int nxf_convert_2bpp(FAR ubyte *dest, uint16 height,
|
|
uint16 width, uint16 stride,
|
|
FAR const struct nx_fontbitmap_s *bm,
|
|
nxgl_mxpixel_t color);
|
|
int nxf_convert_4bpp(FAR ubyte *dest, uint16 height,
|
|
uint16 width, uint16 stride,
|
|
FAR const struct nx_fontbitmap_s *bm,
|
|
nxgl_mxpixel_t color);
|
|
int nxf_convert_8bpp(FAR ubyte *dest, uint16 height,
|
|
uint16 width, uint16 stride,
|
|
FAR const struct nx_fontbitmap_s *bm,
|
|
nxgl_mxpixel_t color);
|
|
int nxf_convert_16bpp(FAR uint16 *dest, uint16 height,
|
|
uint16 width, uint16 stride,
|
|
FAR const struct nx_fontbitmap_s *bm,
|
|
nxgl_mxpixel_t color);
|
|
int nxf_convert_24bpp(FAR uint32 *dest, uint16 height,
|
|
uint16 width, uint16 stride,
|
|
FAR const struct nx_fontbitmap_s *bm,
|
|
nxgl_mxpixel_t color);
|
|
int nxf_convert_32bpp(FAR uint32 *dest, uint16 height,
|
|
uint16 width, uint16 stride,
|
|
FAR const struct nx_fontbitmap_s *bm,
|
|
nxgl_mxpixel_t color);
|
|
</pre></ul>
|
|
<p>
|
|
<b>Description:</b> Convert the 1BPP font to a new pixel depth.
|
|
</p>
|
|
<p>
|
|
<b>Input Parameters:</b>
|
|
<ul><dl>
|
|
<dt><code>dest</code>
|
|
<dd>The destination buffer provided by the caller.
|
|
<dt><code>height</code>
|
|
<dd>The max height of the returned char in rows.
|
|
<dt><code>width</code>
|
|
<dd>The max width of the returned char in pixels.
|
|
<dt><code>stride</code>
|
|
<dd>The width of the destination buffer in bytes.
|
|
<dt><code>bm</code>
|
|
<dd>Describes the character glyph to convert
|
|
<dt><code>color</code>
|
|
<dd>The color to use for '1' bits in the font bitmap (0 bits are transparent).
|
|
</dl></ul>
|
|
</p>
|
|
<p>
|
|
<b>Returned Value:</b>
|
|
<code>OK</code> on success;
|
|
<code>ERROR</code> on failure with <code>errno</code> set appropriately.
|
|
</p>
|
|
|
|
<h2>2.6 <a name="samplecode">Sample Code</a></h2>
|
|
|
|
<p><b><code>examples/nx</code></b>.
|
|
No sample code is provided in this document.
|
|
However, an example can be found in the NuttX source tree at <code>examples/nx</code>.
|
|
That code is intended to test NX.
|
|
Since it is test code, it is designed to exercise functionality and does not necessarily
|
|
represent best NX coding practices.
|
|
</p>
|
|
|
|
<p>
|
|
In its current form, the NX graphics system provides a low level of graphics and window
|
|
support.
|
|
Most of the complexity of manage redrawing and handling mouse and keyboard events must
|
|
be implemented by the NX client code.
|
|
</p>
|
|
|
|
<p><b>Building <code>examples/nx</code></b>.
|
|
Testing was performed using the Linux/Cygwin-based NuttX simulator.
|
|
Instructions are provided for building that simulation are provided in
|
|
<a href="#testcoverage">Appendix C</a> of this document.
|
|
</p>
|
|
|
|
<table width ="100%">
|
|
<tr bgcolor="#e4e4e4">
|
|
<td>
|
|
<h1>Appendix A <a name="grapicsdirs"><code>graphics/</code> Directory Structure</a></h1>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<ul>
|
|
<dl>
|
|
<dt><code>graphics/nxglib</code>
|
|
<dd>The NuttX tiny graphics library.
|
|
The directory contains generic utilities support operations on primitive graphics objects
|
|
and logic to rasterize directly into a framebuffer.
|
|
It has no concept of windows (other than the one, framebuffer window).
|
|
|
|
<dt><code>graphics/nxbe</code>
|
|
<dd>This is the <i>back-end</i> of a tiny windowing system.
|
|
It can be used with either of two front-ends to complete a windowing system (see
|
|
<code>nxmu</code> and <code>nxsu/<code> below).
|
|
It contains most of the important window management logic: clipping, window controls,
|
|
window drawing, etc.
|
|
|
|
<dt><code>graphics/nxsu</code>
|
|
<dd>This is the NX single user <i>front end</i>.
|
|
When combined with the generic <i>back-end</i> (<code>nxbe</code>), it implements a
|
|
single threaded, single user windowing system.
|
|
The files in this directory present the window APIs described in
|
|
<code>include/nuttx/nx.h</code>.
|
|
The single user front-end is selected when <code>CONFIG_NX_MULTIUSER</code> is not
|
|
defined in the NuttX configuration file.
|
|
|
|
<dt><code>graphics/nxsu</code>
|
|
<dd>This is the NX multi user <i>front end</i>.
|
|
When combined with the generic <i>back-end</i> (<code>nxbe</code>), it implements a
|
|
multi-threaded, multi-user windowing system.
|
|
The files in this directory present the window APIs described in
|
|
<code>include/nuttx/nx.h</code>.
|
|
The multi-user front end includes a graphics server that executes on its own thread;
|
|
multiple graphics clients then communicate with the server via a POSIX message
|
|
queue to serialize window operations from many threads.
|
|
The multi-user front-end is selected when <code>CONFIG_NX_MULTIUSER</code> is defined
|
|
in the NuttX configuration file.
|
|
|
|
<dt><code>graphics/nxfonts</code>
|
|
<dd>This is where the NXFONTS implementation resides.
|
|
This is a relatively low-level set of charset set/glyph management APIs.
|
|
See <code>include/nuttx/nxfonts.h</code>.
|
|
|
|
<dt><code>graphics/nxtk</code>
|
|
<dd>This is where the NXTOOLKIT implementation resides.
|
|
This toolkit is built on top of NX and works with either the single-user or
|
|
multi-user NX version.
|
|
See <code>include/nuttx/nxtk.h</code>.
|
|
|
|
<dt><code>graphics/nxwidgets</code>
|
|
<dd>At one time, I planned to put NXWIDGETS implementation here, but not anymore.
|
|
</dl>
|
|
</ul>
|
|
|
|
<table width ="100%">
|
|
<tr bgcolor="#e4e4e4">
|
|
<td>
|
|
<h1>Appendix B <a name="nxconfigs">NX Configuration Options</a></h1>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<h2>B.1 <a name="nxgenconfig">General Configuration Settings</a></h2>
|
|
|
|
<ul>
|
|
<dl>
|
|
<dt><code>CONFIG_NX</code>
|
|
Enables overall support for graphics library and NX
|
|
</dl>
|
|
</ul>
|
|
|
|
<h2>B.2 <a name="nxglconfig">NXGL Configuration Settings</a></h2>
|
|
|
|
<ul>
|
|
<dl>
|
|
<dt><code>CONFIG_NX_NPLANES</code>:
|
|
<dd>Some YUV color formats requires support for multiple planes,
|
|
one for each color component. Unless you have such special
|
|
hardware, this value should be undefined or set to 1.
|
|
<dt><code>CONFIG_NX_DISABLE_1BPP</code>, <code>CONFIG_NX_DISABLE_2BPP</code>,
|
|
<code>CONFIG_NX_DISABLE_4BPP</code>, <code>CONFIG_NX_DISABLE_8BPP</code>
|
|
<code>CONFIG_NX_DISABLE_16BPP</code>, <code>CONFIG_NX_DISABLE_24BPP</code>, and
|
|
<code>CONFIG_NX_DISABLE_32BPP</code>:
|
|
<dd>NX supports a variety of pixel depths. You can save some
|
|
memory by disabling support for unused color depths.
|
|
<dt><code>CONFIG_NX_PACKEDMSFIRST</code>:
|
|
<dd>If a pixel depth of less than 8-bits is used, then NX needs
|
|
to know if the pixels pack from the MS to LS or from LS to MS
|
|
</dl>
|
|
</ul>
|
|
|
|
<h2>B.3 <a name="nxconfig">NX Configuration Settings</a></h2>
|
|
|
|
<ul>
|
|
<dl>
|
|
<dt><code>CONFIG_NX_MOUSE</code>:
|
|
<dd>Build in support for mouse input.
|
|
<dt><code>CONFIG_NX_KBD</code>:
|
|
<dd>Build in support of keypad/keyboard input.
|
|
</dl>
|
|
</ul>
|
|
|
|
<h2>B.4 <a name="nxmuconfig">NX Multi-User (Only) Configuration Settings</a></h2>
|
|
|
|
<ul>
|
|
<dl>
|
|
<dt><code>CONFIG_NX_MULTIUSER</code>:
|
|
<dd>Configures NX in multi-user mode.
|
|
<dt><code>CONFIG_NX_BLOCKING</code>
|
|
<dd>Open the client message queues in blocking mode. In this case,
|
|
<dt><code>nx_eventhandler()</code> will not return until a message is received and processed.
|
|
<dt><code>CONFIG_NX_MXSERVERMSGS</code> and <code>CONFIG_NX_MXCLIENTMSGS</code>
|
|
<dd>Specifies the maximum number of messages that can fit in
|
|
the message queues. No additional resources are allocated, but
|
|
this can be set to prevent flooding of the client or server with
|
|
too many messages (<code>CONFIG_PREALLOC_MQ_MSGS</code> controls how many
|
|
messages are pre-allocated).
|
|
</dl>
|
|
</ul>
|
|
|
|
<h2>B.5 <a name="nxtkconfig">NXTK Configuration Settings</a></h2>
|
|
|
|
<ul>
|
|
<dl>
|
|
<dt><code>CONFIG_NXTK_BORDERWIDTH</code>:
|
|
<dd>Specifies with with of the border (in pixels) used with
|
|
framed windows. The default is 4.
|
|
<dt><code>CONFIG_NXTK_BORDERCOLOR1</code> and <code>CONFIG_NXTK_BORDERCOLOR2</code>:
|
|
<dd>Specify the colors of the border used with framed windows.
|
|
<dt><code>CONFIG_NXTK_BORDERCOLOR2</code> is the shadow side color and so
|
|
<dd>is normally darker. The default is medium and dark grey,
|
|
respectively
|
|
<dt><code>CONFIG_NXTK_AUTORAISE</code>:
|
|
<dd>If set, a window will be raised to the top if the mouse position
|
|
is over a visible portion of the window. Default: A mouse
|
|
button must be clicked over a visible portion of the window.
|
|
</dl>
|
|
</ul>
|
|
|
|
<h2>B.6 <a name="nxfpmtsconfig">NXFONTS Configuration Settings</a></h2>
|
|
|
|
<ul>
|
|
<dl>
|
|
<dt><code>CONFIG_NXFONTS_CHARBITS</code>:
|
|
<dd>The number of bits in the character set. Current options are
|
|
only 7 and 8. The default is 7.
|
|
<dt><code>CONFIG_NXFONT_SANS</code>:
|
|
<dd>At present, there is only one font. But if there were were more,
|
|
then this option would select the sans serif font.
|
|
</dl>
|
|
</ul>
|
|
|
|
<table width ="100%">
|
|
<tr bgcolor="#e4e4e4">
|
|
<td>
|
|
<h1>Appendix C <a name="testcoverage">NX Test Coverage</a></h1>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<p><b><code>examples/nx</code></b>.
|
|
The primary test tool for debugging NX resides at <code>examples/nx</code>.
|
|
</p>
|
|
<p><b>Building <code>examples/nx</code></b>.
|
|
NX testing was performed using <code>examples/nx</code> with the
|
|
Linux/Cygwin-based NuttX simulator.
|
|
Configuration files for building this test can be found in <code>configs/sim/nx</code>.
|
|
There are two alternative configurations for building the simulation:
|
|
</p>
|
|
<ol>
|
|
<li>
|
|
The default configuration using the configuration file at
|
|
<code>configs/sim/nx/defconfig</code>.
|
|
This default configuration exercises the NX logic a 8 BPP but provides no visual feedback.
|
|
In this configuration, a very simple, simulated framebuffer driver is used that is
|
|
based upon a simple region of memory posing as video memory.
|
|
That default configuration can be built as follows:
|
|
<ul><pre>
|
|
cd <NuttX-Directory>/tools
|
|
./configure sim/nx
|
|
cd <NuttX-Directory>
|
|
make
|
|
./nuttx
|
|
</pre></ul>
|
|
</li>
|
|
<li>
|
|
A preferred configuration extends the test with a simulated framebuffer driver
|
|
that uses an X window as a framebuffer.
|
|
This configuration uses the configuration file at <code>configs/sim/nx/defconfig-x11</code>.
|
|
This is a superior test configuration because the X window appears at your desktop
|
|
and you can see the NX output.
|
|
This preferred configuration can be built as follows:
|
|
<ul><pre>
|
|
cd <NuttX-Directory>/tools
|
|
./configure sim/nx
|
|
cd <NuttX-Directory>
|
|
cp <NuttX-Directory>/configs/sim/nx/defconfig-x11 .config
|
|
make
|
|
./nuttx
|
|
</pre></ul>
|
|
</li>
|
|
</ol>
|
|
<p>
|
|
Why isn't this configuration the default? Because not all systems the use NX support X.
|
|
</p>
|
|
|
|
<p><b>Test Coverage</b>.
|
|
At present, <code>examples/nx</code>t only exercises a subset of NX;
|
|
the remainder is essentially untested.
|
|
The following table describes the testing performed on each NX API:
|
|
</p>
|
|
|
|
<center><h2>Table C.1: <a name="nxglibcoverage">NXGLIB API Test Coverage</a></h2></center>
|
|
<center><table border="1" width="80%">
|
|
<tr>
|
|
<th width="40%">Function</th>
|
|
<th width="60%">Special Setup/Notes</th>
|
|
<th width="5%">Verified</th></tr>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxglrgb2yuv"><code>nxgl_rgb2yuv()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="lightgrey">NO</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxglyuv2rgb"><code>nxgl_yuv2rgb()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="lightgrey">NO</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxglrectcopy"><code>nxgl_rectcopy()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxglrectoffset"><code>nxgl_rectoffset()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxglvectoradd"><code>nxgl_vectoradd()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxglvectorsubtract"><code>nxgl_vectorsubtract()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxglrectintersect"><code>nxgl_rectintersect()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxglrectunion"><code>nxgl_rectunion()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxglnonintersecting"><code>nxgl_nonintersecting()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxglrectoverlap"><code>nxgl_rectoverlap()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxglrectinside"><code>nxgl_rectinside()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxglrectsize"><code>nxgl_rectsize()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxglnullrect"><code>nxgl_nullrect()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxglrunoffset"><code>nxgl_runoffset()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="lightgrey">NO</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxglruncopy"><code>nxgl_runcopy()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="lightgrey">NO</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxgltrapoffset"><code>nxgl_trapoffset()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="lightgrey">NO</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxgltrapcopy"><code>nxgl_trapcopy()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="lightgrey">NO</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxglcolorcopy"><code>nxgl_colorcopy</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
</table></center>
|
|
|
|
|
|
<center><h2>Table C.2: <a name="nxcbcoverage">NX Server Callbacks Test Coverage</a></h2></center>
|
|
<center><table border="1" width="80%">
|
|
<tr>
|
|
<th width="40%">Function</th>
|
|
<th width="60%">Special Setup/Notes</th>
|
|
<th width="5%">Verified</th></tr>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxcbredraw"><code>redraw()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxcbposition"><code>position()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxcbmousein"><code>mousein()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxcbkbdin"><code>kbdin()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
</table></center>
|
|
|
|
<center><h2>Table C.3: <a name="nxcoverage">NX API Test Coverage</a></h2></center>
|
|
<center><table border="1" width="80%">
|
|
<tr>
|
|
<th width="40%">Function</th>
|
|
<th width="60%">Special Setup/Notes</th>
|
|
<th width="5%">Verified</th></tr>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxruninstance"><code>nx_runinstance()</code></a></td>
|
|
<td>Change to <code>CONFIG_NX_MULTIUSER=y</code> in the
|
|
<code><NuttX-Directory>/.config</code> file </td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxconnectinstance"><code>nx_connectinstance()</code></a></td>
|
|
<td>Change to <code>CONFIG_NX_MULTIUSER=y</code> in the
|
|
<code><NuttX-Directory>/.config</code> file </td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxopen"><code>nx_open()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxdisconnect"><code>nx_disconnect()</code></a></td>
|
|
<td>Change to <code>CONFIG_NX_MULTIUSER=y</code> in the
|
|
<code><NuttX-Directory>/.config</code> file </td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxclose"><code>nx_close()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxeventhandler"><code>nx_eventhandler()</code></a></td>
|
|
<td>Change to <code>CONFIG_NX_MULTIUSER=y</code> in the
|
|
<code><NuttX-Directory>/.config</code> file</td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxeventnotify"><code>nx_eventnotify()</code></a></td>
|
|
<td>This is not used in the current version of <code>examples/nx</code>,
|
|
was tested in a previous version)</td>
|
|
<td align="center" bgcolor="lightgrey">NO</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxopenwindow"><code>nx_openwindow()</code></a></td>
|
|
<td>Change to <code>CONFIG_EXAMPLES_NX_RAWWINDOWS=y</code> in the
|
|
<code><NuttX-Directory>/.config</code> file</td>
|
|
</td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxclosewindow"><code>nx_closewindow()</code></a></td>
|
|
<td>Change to <code>CONFIG_EXAMPLES_NX_RAWWINDOWS=y</code> in the
|
|
<code><NuttX-Directory>/.config</code> file</td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxrequestbkgd"><code>nx_requestbkgd()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="lightgrey">NO</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxreleasebkgd"><code>nx_releasebkgd()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="lightgrey">NO</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxgetposition"><code>nx_getposition()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="lightgrey">NO</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxsetposition"><code>nx_setposition()</code></a></td>
|
|
<td>Change to <code>CONFIG_EXAMPLES_NX_RAWWINDOWS=y</code> in the
|
|
<code><NuttX-Directory>/.config</code> file</td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxsetsize"><code>nx_setsize()</code></a></td>
|
|
<td>Change to <code>CONFIG_EXAMPLES_NX_RAWWINDOWS=y</code> in the
|
|
<code><NuttX-Directory>/.config</code> file</td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxraise"><code>nx_raise()</code></a></td>
|
|
<td>Change to <code>CONFIG_EXAMPLES_NX_RAWWINDOWS=y</code> in the
|
|
<code><NuttX-Directory>/.config</code> file</td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxlower"><code>nx_lower()</code></a></td>
|
|
<td>Change to <code>CONFIG_EXAMPLES_NX_RAWWINDOWS=y</code> in the
|
|
<code><NuttX-Directory>/.config</code> file</td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxfill"><code>nx_fill()</code></a></td>
|
|
<td>Change to <code>CONFIG_EXAMPLES_NX_RAWWINDOWS=y</code> in the
|
|
<code><NuttX-Directory>/.config</code> file</td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxfilltrapezoid"><code>nx_filltrapezoid()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="lightgrey">NO</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxglrgb2yuv"><code>nx_setbgcolor()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxmove"><code>nx_move()</code></a></td>
|
|
<td>Change to <code>CONFIG_EXAMPLES_NX_RAWWINDOWS=y</code> in the
|
|
<code><NuttX-Directory>/.config</code> file</td>
|
|
<td align="center" bgcolor="lightgrey">NO</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxbitmap"><code>nx_bitmap()</code></a></td>
|
|
<td>Change to <code>CONFIG_EXAMPLES_NX_RAWWINDOWS=y</code> in the
|
|
<code><NuttX-Directory>/.config</code> file.</td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxkbdin"><code>nx_kbdin()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxmousein"><code>nx_mousein()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
</table></center>
|
|
|
|
|
|
<center><h2>Table C.4: <a name="nxtkcoverage">NXTK API Test Coverage</a></h2></center>
|
|
<center><table border="1" width="80%">
|
|
<tr>
|
|
<th width="40%">Function</th>
|
|
<th width="60%">Special Setup/Notes</th>
|
|
<th width="5%">Verified</th></tr>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxtkopenwindow"><code>nxtk_openwindow()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxtkclosewindow"><code>nxtk_closewindow()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxtkgetposition"><code>nxtk_getposition()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="lightgrey">NO</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxtksetposition"><code>nxtk_setposition()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxtksetsize"><code>nxtk_setsize()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxtkraise"><code>nxtk_raise()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxtklower"><code>nxtk_lower()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxtkfillwindow"><code>nxtk_fillwindow()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxtkfilltrapwindow"><code>nxtk_filltrapwindow()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="lightgrey">NO</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxtkmovewindow"><code>nxtk_movewindow()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="lightgrey">NO</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxtkbitmapwindow"><code>nxtk_bitmapwindow()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxtkopentoolbar"><code>nxtk_opentoolbar()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxtkclosetoolbar"><code>nxtk_closetoolbar()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxtkfilltoolbar"><code>nxtk_filltoolbar()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxtkfilltraptoolbar"><code>nxtk_filltraptoolbar()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="lightgrey">NO</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxtkmovetoolbar"><code>nxtk_movetoolbar()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="lightgrey">NO</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxtkbitmaptoolbar"><code>nxtk_bitmaptoolbar()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="lightgrey">NO</td>
|
|
</tr>
|
|
</table></center>
|
|
|
|
<center><h2>Table C.5: <a name="nxfontscoverage">NXFONTS API Test Coverage</a></h2></center>
|
|
<center><table border="1" width="80%">
|
|
<tr>
|
|
<th width="40%">Function</th>
|
|
<th width="60%">Special Setup/Notes</th>
|
|
<th width="5%">Verified</th></tr>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxfgetfontset"><code>nxf_getfontset()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxfgetbitmap"><code>nxf_getbitmap()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxfconvertbpp"><code>nxf_convert_2bpp()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="lightgrey">NO</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxfconvertbpp"><code>nxf_convert_4bpp()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="lightgrey">NO</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxfconvertbpp"><code>nxf_convert_8bpp()</code></a></td>
|
|
<td>Use <code>defconfig</code> when building.</td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxfconvertbpp"><code>nxf_convert_16bpp()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="lightgrey">NO</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxfconvertbpp"><code>nxf_convert_24bpp()</code></a></td>
|
|
<td><br></td>
|
|
<td align="center" bgcolor="lightgrey">NO</td>
|
|
</tr>
|
|
<tr>
|
|
<td align="left" valign="top"><a href="#nxfconvertbpp"><code>nxf_convert_32bpp()</code></a></td>
|
|
<td>Use <code>defconfig-x11</code> when building.</td>
|
|
<td align="center" bgcolor="skyblue">YES</td>
|
|
</tr>
|
|
</table></center>
|
|
|
|
</body>
|
|
</html>
|
|
|