r6639 tlsa - /trunk/netsurfweb/developers/gsoc/2009ideas.en
by netsurf@semichrome.net
Author: tlsa
Date: Thu Feb 26 12:01:38 2009
New Revision: 6639
URL: http://source.netsurf-browser.org?rev=6639&view=rev
Log:
Minor improvements and remove ambiguous stuff.
Modified:
trunk/netsurfweb/developers/gsoc/2009ideas.en
Modified: trunk/netsurfweb/developers/gsoc/2009ideas.en
URL: http://source.netsurf-browser.org/trunk/netsurfweb/developers/gsoc/2009id...
==============================================================================
--- trunk/netsurfweb/developers/gsoc/2009ideas.en (original)
+++ trunk/netsurfweb/developers/gsoc/2009ideas.en Thu Feb 26 12:01:38 2009
@@ -89,7 +89,7 @@
<h2>Native Windows or Mac OS X port</h2>
<p>NetSurf currently has user-interface layers for several systems including the RISC OS, GTK (on Linux, FreeBSD, etc.), AmigaOS and BeOS. The GTK interface works on Windows or Mac OS X, but a native interface for these systems would give a better experience.</p>
-<p>The existing front end implementations can be used for examples. Of these the framebuffer front end is very self contained and the debug front end is the most minimal. For the rendering of NetSurf's content area, a set of plotters need to be implemented for drawing primitives such as rectangles, plotting bitmaps and text.</p>
+<p>The existing front end implementations can be used as examples. Of these, the framebuffer front end is very self contained and the debug front end is the most minimal. For the rendering of NetSurf's content area, a set of plotters needs to be implemented for drawing primitives such as rectangles, plotting bitmaps and text.</p>
<p><strong>Skills required:</strong> C, Windows UI development or Mac OS X UI development</p>
<p><strong>Difficulty:</strong> Medium</p>
<p><strong>Existing code:</strong> <a href="http://source.netsurf-browser.org/trunk/netsurf/desktop/gui.h?view=markup">Declarations of functions that each interface must implement</a>, <a href="http://source.netsurf-browser.org/trunk/netsurf/desktop/plotters.h?view=m...">plotters interface</a>, <a href="http://source.netsurf-browser.org/trunk/netsurf/riscos/">RISC OS specific code</a>, <a href="http://source.netsurf-browser.org/trunk/netsurf/gtk/">GTK specific code</a>, <a href="http://source.netsurf-browser.org/trunk/netsurf/beos/">BeOS specific code</a>, <a href="http://source.netsurf-browser.org/trunk/netsurf/amiga/">AmigaOS specific code</a>, <a href="http://source.netsurf-browser.org/trunk/netsurf/framebuffer/">framebuffer specific code</a></p>
@@ -190,9 +190,7 @@
<li>Bookmarks (also see core UI enhancements idea)</li>
<li>Improved contextual right-click menu ("Save image as..." and "Open in new tab..." for example)</li>
<li>GUI should adjust to match GTK interface preferences (icons in menu, text under toolbar buttons, etc.)</li>
-<li>Rewrite preferences.c and scaffolding.c <strong>??? To what end? ???</strong></li>
<li>File uploads</li>
-<li>Disk cache editor <strong>??? What is this? ???</strong></li></li>
<li>View source</li>
<li>Documentation (user guide)</li>
<li>Favicons</li>
14 years, 6 months
r6638 tlsa - in /trunk/netsurfweb/developers/gsoc: 2009ideas.en index.en
by netsurf@semichrome.net
Author: tlsa
Date: Thu Feb 26 11:58:11 2009
New Revision: 6638
URL: http://source.netsurf-browser.org?rev=6638&view=rev
Log:
Update ideas page and GSoC page.
Modified:
trunk/netsurfweb/developers/gsoc/2009ideas.en
trunk/netsurfweb/developers/gsoc/index.en
Modified: trunk/netsurfweb/developers/gsoc/2009ideas.en
URL: http://source.netsurf-browser.org/trunk/netsurfweb/developers/gsoc/2009id...
==============================================================================
--- trunk/netsurfweb/developers/gsoc/2009ideas.en (original)
+++ trunk/netsurfweb/developers/gsoc/2009ideas.en Thu Feb 26 11:58:11 2009
@@ -2,7 +2,7 @@
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
-<title>NetSurf | Google Summer of Code 2008 Ideas</title>
+<title>NetSurf | Google Summer of Code 2009 Ideas</title>
<link rel="stylesheet" title="Standard" type="text/css" href="/netsurf.css">
</head>
@@ -51,7 +51,7 @@
<h1>Google Summer of Code Ideas</h1>
-<p>This page lists our project ideas for <strong><a href="http://code.google.com/soc/2008/">Google Summer of Code 2009</a></strong>.</p>
+<p>This page lists our project ideas for <strong><a href="http://code.google.com/soc/">Google Summer of Code 2009</a></strong>.</p>
<dl>
<dt>Before applying for a project<dt>
@@ -89,10 +89,10 @@
<h2>Native Windows or Mac OS X port</h2>
<p>NetSurf currently has user-interface layers for several systems including the RISC OS, GTK (on Linux, FreeBSD, etc.), AmigaOS and BeOS. The GTK interface works on Windows or Mac OS X, but a native interface for these systems would give a better experience.</p>
-<p><strong>??? Something here about using the existing front end code for a examples. Debug and Framebuffer are simplest and most self contained. Mention plotters. ???</strong></p>
+<p>The existing front end implementations can be used for examples. Of these the framebuffer front end is very self contained and the debug front end is the most minimal. For the rendering of NetSurf's content area, a set of plotters need to be implemented for drawing primitives such as rectangles, plotting bitmaps and text.</p>
<p><strong>Skills required:</strong> C, Windows UI development or Mac OS X UI development</p>
<p><strong>Difficulty:</strong> Medium</p>
-<p><strong>Existing code:</strong> <a href="http://source.netsurf-browser.org/trunk/netsurf/desktop/gui.h?view=markup">Declarations of functions that each interface must implement</a>, <a href="http://source.netsurf-browser.org/trunk/netsurf/riscos/">RISC OS specific code</a>, <a href="http://source.netsurf-browser.org/trunk/netsurf/gtk/">GTK specific code</a>, <a href="http://source.netsurf-browser.org/trunk/netsurf/beos/">BeOS specific code</a>, <a href="http://source.netsurf-browser.org/trunk/netsurf/amiga/">AmigaOS specific code</a>, <a href="http://source.netsurf-browser.org/trunk/netsurf/framebuffer/">framebuffer specific code</a></p>
+<p><strong>Existing code:</strong> <a href="http://source.netsurf-browser.org/trunk/netsurf/desktop/gui.h?view=markup">Declarations of functions that each interface must implement</a>, <a href="http://source.netsurf-browser.org/trunk/netsurf/desktop/plotters.h?view=m...">plotters interface</a>, <a href="http://source.netsurf-browser.org/trunk/netsurf/riscos/">RISC OS specific code</a>, <a href="http://source.netsurf-browser.org/trunk/netsurf/gtk/">GTK specific code</a>, <a href="http://source.netsurf-browser.org/trunk/netsurf/beos/">BeOS specific code</a>, <a href="http://source.netsurf-browser.org/trunk/netsurf/amiga/">AmigaOS specific code</a>, <a href="http://source.netsurf-browser.org/trunk/netsurf/framebuffer/">framebuffer specific code</a></p>
<p><strong>References:</strong></p>
<h2>Keyboard navigation</h2>
@@ -179,15 +179,15 @@
<p>Further to the above, the way NetSurf's core implements HTML frames is not particularly portable. This could be addressed as an extension.</p>
<p><strong>Skills required:</strong> C</p>
<p><strong>Difficulty:</strong> Easy – Medium</p>
-<p><strong>Existing code:</strong> <a href="http://source.netsurf-browser.org/trunk/netsurf/desktop/tree.c?view=markup">Core options code</a></p>
-<p><strong>References:</strong> <a href="http://source.netsurf-browser.org/trunk/netsurf/desktop/plotters.h?view=m...">plotters interface</a></p>
+<p><strong>Existing code:</strong> <a href="http://source.netsurf-browser.org/trunk/netsurf/desktop/tree.h?view=markup">Core treeview interface</a>, <a href="http://source.netsurf-browser.org/trunk/netsurf/desktop/tree.c?view=markup">Core treeview code</a></p>
+<p><strong>References:</strong> <a href="http://source.netsurf-browser.org/trunk/netsurf/desktop/plotters.h?view=m...">plotters interface</a>, <a href="http://source.netsurf-browser.org/trunk/netsurf/riscos/textarea.c?view=ma...">textarea widget code</a></p>
<h2>Improved GTK front end</h2>
<p>NetSurf's GTK frontend is fairly usable at present, but would benefit from enhancement.</p>
<p>Outstanding functionality includes:</p>
<ul>
<li>Find</li>
-<li>Bookmarks (also see core UI enchancements idea)</li>
+<li>Bookmarks (also see core UI enhancements idea)</li>
<li>Improved contextual right-click menu ("Save image as..." and "Open in new tab..." for example)</li>
<li>GUI should adjust to match GTK interface preferences (icons in menu, text under toolbar buttons, etc.)</li>
<li>Rewrite preferences.c and scaffolding.c <strong>??? To what end? ???</strong></li>
@@ -208,11 +208,11 @@
<ul>
<li>Tabs</li>
<li>Download window</li>
-<li>Bookmarks, also see core UI enchancements idea</li>
-<li>History, also see core UI enchancements idea</li>
-<li>Fix <frame> support, also see core UI enchancements idea</li>
+<li>Bookmarks, also see core UI enhancements idea</li>
+<li>History, also see core UI enhancements idea</li>
+<li>Fix <frame> support, also see core UI enhancements idea</li>
<li>Printing</li>
-<li>Preferencess window</li>
+<li>Preferences window</li>
</ul>
<p><strong>Skills required:</strong> C++, BeOS/Haiku UI toolkits</p>
<p><strong>Difficulty:</strong> Easy – Medium</p>
Modified: trunk/netsurfweb/developers/gsoc/index.en
URL: http://source.netsurf-browser.org/trunk/netsurfweb/developers/gsoc/index....
==============================================================================
--- trunk/netsurfweb/developers/gsoc/index.en (original)
+++ trunk/netsurfweb/developers/gsoc/index.en Thu Feb 26 11:58:11 2009
@@ -2,7 +2,7 @@
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
-<title>NetSurf | Google Summer of Code 2008</title>
+<title>NetSurf | Google Summer of Code</title>
<link rel="stylesheet" title="Standard" type="text/css" href="/netsurf.css">
</head>
@@ -49,9 +49,15 @@
<p class="breadcrumbs"><a href="/">Home</a> » <a href="/developers/">Developer area</a> » Google Summer of Code</p>
-<h1>Google Summer of Code 2008</h1>
+<h1>Google Summer of Code</h1>
-<p>NetSurf is participating as a mentoring organisation in <a href="http://code.google.com/soc/2008/">Google Summer of Code 2008</a>. Our four students are listed below.</p>
+<p>The NetSurf project intends to apply to become a mentoring organisation for the <a href="http://code.google.com/soc/"> Google Summer of Code 2009</a>. We our working on our <a href="2009ideas">ideas page</a>.</p>
+
+<p>We ask students to keep NetSurf's <a href="http://www.netsurf-browser.org/about/#ProjectGoals">project goals</a> in mind, especially the first point. We also ask them to communicate with the developers as much as possible. More information for students is available on the <a href="http://wiki.netsurf-browser.org/">development wiki</a>.</p>
+
+<h2>Google Summer of Code 2008</h2>
+
+<p>NetSurf participated as a mentoring organisation in <a href="http://code.google.com/soc/2008/">Google Summer of Code 2008</a>. We ran four projects which are listed below.</p>
<dl class="gsocstudents">
<dt>Adam Blokus</dt>
@@ -88,11 +94,9 @@
</dd>
</dl>
-<p>We ask our students to keep NetSurf's <a href="http://www.netsurf-browser.org/about/#ProjectGoals">project goals</a> in mind, especially the first point. We also ask them to communicate with the developers as much as possible. More information for students is available on the <a href="http://wiki.netsurf-browser.org/">development wiki</a>.</p>
+<!--p>Our students are blogging their progress this summer. You can follow their activities on <a href="http://planet.netsurf-browser.org/">Planet NetSurf</a>.</p-->
-<p>Our students are blogging their progress this summer. You can follow their activities on <a href="http://planet.netsurf-browser.org/">Planet NetSurf</a>.</p>
-
-<p>Our original <a href="2008ideas">GSoC ideas page</a> is still available.</p>
+<p>Our <a href="2008ideas">2008 GSoC ideas page</a> is still available.</p>
<div class="footer">
14 years, 6 months
r6637 tlsa - /trunk/netsurfweb/developers/gsoc/2009ideas.en
by netsurf@semichrome.net
Author: tlsa
Date: Thu Feb 26 10:55:19 2009
New Revision: 6637
URL: http://source.netsurf-browser.org?rev=6637&view=rev
Log:
Add tabs to BeOS idea. Minor changes.
Modified:
trunk/netsurfweb/developers/gsoc/2009ideas.en
Modified: trunk/netsurfweb/developers/gsoc/2009ideas.en
URL: http://source.netsurf-browser.org/trunk/netsurfweb/developers/gsoc/2009id...
==============================================================================
--- trunk/netsurfweb/developers/gsoc/2009ideas.en (original)
+++ trunk/netsurfweb/developers/gsoc/2009ideas.en Thu Feb 26 10:55:19 2009
@@ -203,12 +203,13 @@
<p><strong>References:</strong></p>
<h2>Improved Haiku/BeOS front end</h2>
-<p>NetSurf's BeOS frontend is reasonably usable, but would benefit from some enhancement. <strong>??? ? ???</strong></p>
+<p>NetSurf's BeOS frontend is reasonably usable, but would benefit from some enhancement.</p>
<p>Outstanding functionality includes:</p>
<ul>
+<li>Tabs</li>
<li>Download window</li>
-<li>Bookmark backend, possibly using native bookmark format (empty files with xattrs), also see core UI enchancements idea</li>
-<li>History backend</li>
+<li>Bookmarks, also see core UI enchancements idea</li>
+<li>History, also see core UI enchancements idea</li>
<li>Fix <frame> support, also see core UI enchancements idea</li>
<li>Printing</li>
<li>Preferencess window</li>
14 years, 6 months
r6636 tlsa - /trunk/netsurfweb/developers/gsoc/2009ideas.en
by netsurf@semichrome.net
Author: tlsa
Date: Thu Feb 26 10:43:55 2009
New Revision: 6636
URL: http://source.netsurf-browser.org?rev=6636&view=rev
Log:
First draft of ideas page for 2009 GSoC.
Added:
trunk/netsurfweb/developers/gsoc/2009ideas.en
Added: trunk/netsurfweb/developers/gsoc/2009ideas.en
URL: http://source.netsurf-browser.org/trunk/netsurfweb/developers/gsoc/2009id...
==============================================================================
--- trunk/netsurfweb/developers/gsoc/2009ideas.en (added)
+++ trunk/netsurfweb/developers/gsoc/2009ideas.en Thu Feb 26 10:43:55 2009
@@ -1,0 +1,251 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+<title>NetSurf | Google Summer of Code 2008 Ideas</title>
+<link rel="stylesheet" title="Standard" type="text/css" href="/netsurf.css">
+</head>
+
+<body>
+<p class="banner"><a href="/"><img src="/netsurf.png" alt="NetSurf"></a></p>
+
+<div class="navigation">
+<div class="navsection">
+<ul>
+<li><a href="/about/">About NetSurf</a></li>
+<li><a href="/downloads/">Downloads</a></li>
+<li><a href="/documentation/">Documentation</a></li>
+<li><a href="/developers/">Development area</a>
+<ul>
+<li><a href="/developers/contribute">Contribution</a></li>
+<li><a href="/developers/gsoc">GSoC 2008</a></li>
+</ul>
+</li>
+<li><a href="/webmasters/">Webmaster area</a></li>
+<li><a href="/contact/">Contact</a></li>
+</ul>
+</div>
+
+<div class="navsection">
+<ul class="languages">
+<!--<li><a href="index.de">Deutsch</a></li>-->
+<li>English</li>
+<!--<li><a href="index.fr">Français</a></li>-->
+<!--<li><a href="index.nl">Nederlands</a></li>-->
+</ul>
+</div>
+
+<div class="navsection">
+<ul class="sitelinks">
+<li><a href="http://wiki.netsurf-browser.org/">Development wiki</a></li>
+<li><a href="http://planet.netsurf-browser.org/">Planet NetSurf</a></li>
+<li><a href="http://source.netsurf-browser.org/">SVN repository viewer</a></li>
+</ul>
+</div>
+
+</div>
+
+<div class="content">
+
+<p class="breadcrumbs"><a href="/">Home</a> » <a href="/developers/">Developer area</a> » Google Summer of Code</p>
+
+<h1>Google Summer of Code Ideas</h1>
+
+<p>This page lists our project ideas for <strong><a href="http://code.google.com/soc/2008/">Google Summer of Code 2009</a></strong>.</p>
+
+<dl>
+<dt>Before applying for a project<dt>
+<dd>
+<ul>
+<li>Join our IRC channel <code>#netsurf</code> on <a href="http://freenode.net/">Freenode</a> and introduce yourself. Also, subscribe to the <a href="http://www.netsurf-browser.org/lists/netsurf-dev">developer mailing list</a>.</li>
+<li>Have access to a computer with supported OS (RISC OS, Linux, FreeBSD, etc) or an OS relevant for the project you want to apply for (Windows, Mac OS).</li>
+<li>Get up to speed with <a href="http://subversion.tigris.org/">Subversion</a>, as we use this for source control, and get the NetSurf <a href="http://www.netsurf-browser.org/documentation/develop#Subversion">source code</a>.</li>
+<li><a href="http://www.netsurf-browser.org/documentation/develop#Compiling">Build NetSurf</a> and enjoy using it. (Ask if you need help.)</li>
+<li>Get familiarised with the source code – read the <a href="http://source.netsurf-browser.org/trunk/netsurf/Docs/">code documentation</a>.</li>
+</ul>
+<dd>
+<dt>When applying for a project<dt>
+<dd>
+<ul>
+<li>Create a set of project milestones (ranging from a couple to maximum 10). This will be useful for you as guidance and for us to set our expectations right.</li>
+<li>Include your IRC nick in your application if you've spoken with us on <code>#netsurf</code>, so that we recognise you.</li>
+</ul>
+<dd>
+<dt>During the project</dt>
+<dd>
+<ul>
+<li>Most of NetSurf team communication happens via #netsurf IRC during evenings and nights (<a href="http://en.wikipedia.org/wiki/Central_European_Time">CET</a>). We expect you to join in on a regular basis for help, discussions and project updates. Note that you're not restricted to speaking to your assigned mentor; the whole development team are willing to help wherever they can.</li>
+<li>When improving NetSurf's layout engine, be able to create <a href="http://source.netsurf-browser.org/trunk/netsurftest/">test cases</a> and verify that existing test cases don't get broken.</li>
+<li>Keep NetSurf's <a href="http://www.netsurf-browser.org/about/#ProjectGoals">project goals</a> in mind, especially the first point.</li>
+</ul>
+</dd>
+</dl>
+
+<p>Please <a href="/contact/">get in touch</a> if any of these ideas appeal to you or if you have your own idea for either <a href="/">NetSurf</a> or one of NetSurf's <a href="/projects/">sub-projects</a>. Come and chat to the developers in the NetSurf IRC channel or post to the developer mailing list.</p>
+
+<p>All these ideas require knowledge of C, as NetSurf is entirely written in C.</p>
+
+<p>See the <a href="http://sourceforge.net/tracker/?func=browse&group_id=51719&atid=4...">Feature Requests</a> tracker for more ideas.</p>
+
+<h2>Native Windows or Mac OS X port</h2>
+<p>NetSurf currently has user-interface layers for several systems including the RISC OS, GTK (on Linux, FreeBSD, etc.), AmigaOS and BeOS. The GTK interface works on Windows or Mac OS X, but a native interface for these systems would give a better experience.</p>
+<p><strong>??? Something here about using the existing front end code for a examples. Debug and Framebuffer are simplest and most self contained. Mention plotters. ???</strong></p>
+<p><strong>Skills required:</strong> C, Windows UI development or Mac OS X UI development</p>
+<p><strong>Difficulty:</strong> Medium</p>
+<p><strong>Existing code:</strong> <a href="http://source.netsurf-browser.org/trunk/netsurf/desktop/gui.h?view=markup">Declarations of functions that each interface must implement</a>, <a href="http://source.netsurf-browser.org/trunk/netsurf/riscos/">RISC OS specific code</a>, <a href="http://source.netsurf-browser.org/trunk/netsurf/gtk/">GTK specific code</a>, <a href="http://source.netsurf-browser.org/trunk/netsurf/beos/">BeOS specific code</a>, <a href="http://source.netsurf-browser.org/trunk/netsurf/amiga/">AmigaOS specific code</a>, <a href="http://source.netsurf-browser.org/trunk/netsurf/framebuffer/">framebuffer specific code</a></p>
+<p><strong>References:</strong></p>
+
+<h2>Keyboard navigation</h2>
+<p>The browser currently requires a mouse to use. Keyboard shortcuts would move between and activate links, inputs, etc. The document structure is stored in a tree, and algorithms for walking through the tree to find the next link or input would need to be developed. A further improvement would be to take layout position into account and implement moving in 2D.</p>
+<p><strong>Skills required:</strong> C, HTML, CSS, usability</p>
+<p><strong>Difficulty:</strong> Easy</p>
+<p><strong>Existing code:</strong> <a href="http://source.netsurf-browser.org/trunk/netsurf/desktop/textinput.c?view=...">Key press handling</a>, <a href="http://source.netsurf-browser.org/trunk/netsurf/render/box.h?view=markup">Box tree structures</a></p>
+<p><strong>References:</strong></p>
+
+<h2>Page reader</h2>
+<p>The web is a vast resource of information and services. Traditional browsers enable its access for people who can see. NetSurf attempts to help partially sighted users with a sophisticated scaling / zoom feature, however it could be improved further with a page reading option. Speech synthesis could be used to render pages as spoken output.</p>
+<p>There are already several libraries for speech synthesis. This project would first involve enabling NetSurf to speak the textual content of a page. Further work would improve the usability of the system by consideration for such factors as:</p>
+<ul>
+<li>Overview mode, which announces the document headings</li>
+<li>Section skipping to allow swift to access to the next part of the document</li>
+<li>Repetition of the current section or skipping back to previous sections</li>
+<li>How to differentiate link text from the rest of the text</li>
+<li>How to handle emphasis tags; <em> and <strong></li>
+</ul>
+<p><strong>Skills required:</strong> C, accessibility</p>
+<p><strong>Difficulty:</strong> Medium – Hard</p>
+<p><strong>Existing code:</strong></p>
+<p><strong>References:</strong> <a href="http://espeak.sourceforge.net/">eSpeak text to speech synthesizer</a></p>
+
+<h2>Layout engine improvements</h2>
+<p>The layout engine forms part of the core of the browser. It is responsible for calculating the position of each part of the page. It currently has a number of deficiencies which should be addressed. These include:</p>
+<ul>
+<li>Stacking order</li>
+<li>Fixed position boxes</li>
+<li>Fixed backgrounds</li>
+<li>Table stuff (various issues with row style)</li>
+<li>Vertical alignment</li>
+<li>Handling of whitespace</li>
+</ul>
+<p><strong>Skills required:</strong> C, HTML, CSS</p>
+<p><strong>Difficulty:</strong> Medium – Hard</p>
+<p><strong>Existing code:</strong> <a href="http://source.netsurf-browser.org/trunk/netsurf/render/layout.c?view=markup">layout engine</a>, <a href="http://source.netsurf-browser.org/trunk/netsurf/render/html_redraw.c?view...">rendering code</a></p>
+<p><strong>References:</strong> <a href="http://www.w3.org/TR/CSS21">CSS 2.1 specification</a></p>
+
+<h2>LibDOM</h2>
+<p>LibDOM is an implementation of the W3C DOM. It currently implements a large proportion of DOM Level 3 Core. It is a work in progress and requires a fairly large number of fixes and additions before it can be integrated into NetSurf. Things that need doing include:</p>
+<ul>
+<li>Fixing so it compiles</li>
+<li>Sort out the mess that is dom_string</li>
+<li>Use vtables rather than known function names + switching on node type</li>
+<li>Test suite</li>
+<li>Write a binding to Hubbub</li>
+<li>The rest of DOM 3/2/1/0 implementing:
+<ul>
+<li>Events</li>
+<li>HTML</li>
+<li>The rest</li>
+</ul>
+</li>
+<li>Integration with NetSurf</li>
+</ul>
+<p><strong>Skills required:</strong> DOM</p>
+<p><strong>Difficulty:</strong> Medium – Hard</p>
+<p><strong>Existing code:</strong> <a href="http://source.netsurf-browser.org/trunk/libdom/">LibDOM sources</a></p>
+<p><strong>References:</strong> <a href="http://www.w3.org/DOM/DOMTR">DOM specifications</a></p>
+
+<h2>LibSVGTiny</h2>
+<p><strong>??? Need details. ???</strong></li></p>
+<p><strong>Skills required:</strong> C, computer graphics, SVG</p>
+<p><strong>Difficulty:</strong> Medium <strong>??? ? ???</strong></p>
+<p><strong>Existing code:</strong> <a href="http://source.netsurf-browser.org/trunk/libsvgtiny/">LibSVGTiny sources</a></p>
+<p><strong>References:</strong> <a href="http://source.netsurf-browser.org/trunk/libsvgtiny/README">LibSVGTiny overview document</a>, <a href="http://www.w3.org/Graphics/SVG/">W3C SVG section</a>, <a href="http://www.w3.org/TR/SVGTiny12/">SVG Tiny 1.2 specification</a></p>
+
+<h2>Automated NetSurf layout test suite</h2>
+<p><strong>??? Need details. ???</strong></li></p>
+<p><strong>Skills required:</strong> C, HTML, CSS</p>
+<p><strong>Difficulty:</strong> Medium <strong>??? ? ???</strong></p>
+<p><strong>Existing code:</strong></p>
+<p><strong>References:</strong></p>
+
+<h2>Core UI enhancements</h2>
+<p>So that NetSurf can draw pages on different platforms, there is an interface between the core cross-platform code and the frontend UI code that abstracts plotting. This interface is used to plot everything within the browser's content area.</p>
+<p>There are parts of NetSurf's user interface which are common across platforms. However, each platform frontend has to implement these separately. This results in unnecessary duplication of functionality. Therefore, it would be good to move support for some of the common widgets into the core and draw them using the same plotting interface as used for the content area.</p>
+<p>Initially, this will require:</p>
+<ul>
+<li>A plotter-based treeview for global history, cookie manager and bookmarks.</li>
+<li>A plotter-based (single & multi line) text input widget.</li>
+</ul>
+<p>Further to the above, the way NetSurf's core implements HTML frames is not particularly portable. This could be addressed as an extension.</p>
+<p><strong>Skills required:</strong> C</p>
+<p><strong>Difficulty:</strong> Easy – Medium</p>
+<p><strong>Existing code:</strong> <a href="http://source.netsurf-browser.org/trunk/netsurf/desktop/tree.c?view=markup">Core options code</a></p>
+<p><strong>References:</strong> <a href="http://source.netsurf-browser.org/trunk/netsurf/desktop/plotters.h?view=m...">plotters interface</a></p>
+
+<h2>Improved GTK front end</h2>
+<p>NetSurf's GTK frontend is fairly usable at present, but would benefit from enhancement.</p>
+<p>Outstanding functionality includes:</p>
+<ul>
+<li>Find</li>
+<li>Bookmarks (also see core UI enchancements idea)</li>
+<li>Improved contextual right-click menu ("Save image as..." and "Open in new tab..." for example)</li>
+<li>GUI should adjust to match GTK interface preferences (icons in menu, text under toolbar buttons, etc.)</li>
+<li>Rewrite preferences.c and scaffolding.c <strong>??? To what end? ???</strong></li>
+<li>File uploads</li>
+<li>Disk cache editor <strong>??? What is this? ???</strong></li></li>
+<li>View source</li>
+<li>Documentation (user guide)</li>
+<li>Favicons</li>
+</ul>
+<p><strong>Skills required:</strong> C, GTK</p>
+<p><strong>Difficulty:</strong> Easy – Medium</p>
+<p><strong>Existing code:</strong> <a href="http://source.netsurf-browser.org/trunk/netsurf/gtk/">GTK specific code</a></p>
+<p><strong>References:</strong></p>
+
+<h2>Improved Haiku/BeOS front end</h2>
+<p>NetSurf's BeOS frontend is reasonably usable, but would benefit from some enhancement. <strong>??? ? ???</strong></p>
+<p>Outstanding functionality includes:</p>
+<ul>
+<li>Download window</li>
+<li>Bookmark backend, possibly using native bookmark format (empty files with xattrs), also see core UI enchancements idea</li>
+<li>History backend</li>
+<li>Fix <frame> support, also see core UI enchancements idea</li>
+<li>Printing</li>
+<li>Preferencess window</li>
+</ul>
+<p><strong>Skills required:</strong> C++, BeOS/Haiku UI toolkits</p>
+<p><strong>Difficulty:</strong> Easy – Medium</p>
+<p><strong>Existing code:</strong> <a href="http://source.netsurf-browser.org/trunk/netsurf/beos/">BeOS specific code</a></p>
+<p><strong>References:</strong></p>
+
+<h2>Improved RISC OS front end</h2>
+<p>NetSurf's RISC OS frontend is the most feature complete. There are various ways in which it could be improved. These include:</p>
+<ul>
+<li>Tabs</li>
+<li>Better config e.g. web page language choice option</li>
+<li>Richer status bar, perhaps progress bar and icons for SSL, and to indicate what it's doing</li>
+<li>OLE</li>
+<li>Favicons</li>
+</ul>
+<p><strong>Skills required:</strong> C, RISC OS Wimp programming using OSLib</p>
+<p><strong>Difficulty:</strong> Medium</p>
+<p><strong>Existing code:</strong> <a href="http://source.netsurf-browser.org/trunk/netsurf/riscos/">RISC OS specific code</a></p>
+<p><strong>References:</strong></p>
+
+<div class="footer">
+<p>Copyright 2003 - 2009 The NetSurf Developers</p>
+</div>
+
+</div>
+
+
+<form method="get" action="http://www.google.co.uk/search">
+<div class="searchbox">
+<input type="hidden" name="q" value="site:netsurf-browser.org">
+<input type="text" name="q" maxlength="255"><br>
+<input type="submit" value="Search" name="btnG">
+</div>
+</form>
+
+</body>
+</html>
14 years, 6 months
r6635 vince - /trunk/netsurf/framebuffer/fb_32bpp_plotters.c
by netsurf@semichrome.net
Author: vince
Date: Thu Feb 26 10:14:48 2009
New Revision: 6635
URL: http://source.netsurf-browser.org?rev=6635&view=rev
Log:
make 32bpp plotter endian agnostic
Modified:
trunk/netsurf/framebuffer/fb_32bpp_plotters.c
Modified: trunk/netsurf/framebuffer/fb_32bpp_plotters.c
URL: http://source.netsurf-browser.org/trunk/netsurf/framebuffer/fb_32bpp_plot...
==============================================================================
--- trunk/netsurf/framebuffer/fb_32bpp_plotters.c (original)
+++ trunk/netsurf/framebuffer/fb_32bpp_plotters.c Thu Feb 26 10:14:48 2009
@@ -38,12 +38,33 @@
(x << 2));
}
+#if __BYTE_ORDER == __BIG_ENDIAN
+static inline colour fb_32bpp_to_colour(uint32_t pixel)
+{
+ return ((pixel & 0xFF00) >> 8) |
+ ((pixel & 0xFF0000) >> 8) |
+ ((pixel & 0xFF000000) >> 8);
+}
+
+/* convert a colour value to a 32bpp pixel value ready for screen output */
+static inline uint32_t fb_colour_to_pixel(colour c)
+{
+ return ((c & 0xff0000) << 8) | (c & 0xff00) << 8 | ((c & 0xff) << 8);
+}
+#else
static inline colour fb_32bpp_to_colour(uint32_t pixel)
{
return ((pixel & 0xFF) << 16) |
((pixel & 0xFF00)) |
((pixel & 0xFF0000) >> 16);
}
+
+/* convert a colour value to a 32bpp pixel value ready for screen output */
+static inline uint32_t fb_colour_to_pixel(colour c)
+{
+ return ((c & 0xff0000) >> 16) | (c & 0xff00) | ((c & 0xff) << 16);
+}
+#endif
#define SIGN(x) ((x<0) ? -1 : ((x>0) ? 1 : 0))
@@ -63,7 +84,7 @@
if (y0 < fb_plot_ctx.y0)
return true;
- ent = ((c & 0xff0000) >> 16) | (c & 0xff00) | ((c & 0xff) << 16);
+ ent = fb_colour_to_pixel(c);
if (y0 == y1) {
/* horizontal line special cased */
@@ -163,8 +184,8 @@
if (!fb_plotters_clip_rect_ctx(&x0, &y0, &x1, &y1))
return true; /* fill lies outside current clipping region */
+ ent = fb_colour_to_pixel(c);
llen = (framebuffer->linelen >> 2);
- ent = ((c & 0xff0000) >> 16) | (c & 0xff00) | ((c & 0xff) << 16);
width = x1 - x0;
height = y1 - y0;
@@ -240,8 +261,7 @@
xoff = x0 - x;
yoff = y0 - y;
- fgcol = ((c & 0xff0000) >> 16) | (c & 0xff00) | ((c & 0xff) << 16);
-
+ fgcol = fb_colour_to_pixel(c);
pvideo = fb_32bpp_get_xy_loc(x, y0);
@@ -313,10 +333,7 @@
fb_32bpp_to_colour(*(pvideo + xloop)));
}
- *(pvideo + xloop) = ((abpixel & 0xFF) << 16) |
- ((abpixel & 0xFF00)) |
- ((abpixel & 0xFF0000) >> 16);
-
+ *(pvideo + xloop) = fb_colour_to_pixel(abpixel);
}
}
pvideo += (framebuffer->linelen >> 2);
@@ -412,7 +429,7 @@
xoff = x0 - x;
yoff = y0 - y;
- fgcol = ((c & 0xff0000) >> 16) | (c & 0xff00) | ((c & 0xff) << 16);
+ fgcol = fb_colour_to_pixel(c);
/*LOG(("x %d, y %d, style %p, txt %.*s , len %d, bg 0x%lx, fg 0x%lx",
x,y,style,length,text,length,bg,c));*/
@@ -519,10 +536,7 @@
fb_32bpp_to_colour(*(pvideo + xloop)));
}
- *(pvideo + xloop) = ((abpixel & 0xFF) << 16) |
- ((abpixel & 0xFF00)) |
- ((abpixel & 0xFF0000) >> 16);
-
+ *(pvideo + xloop) = fb_colour_to_pixel(abpixel);
}
}
pvideo += (framebuffer->linelen >> 2);
14 years, 6 months
r6634 tlsa - /trunk/netsurf/framebuffer/fb_rootwindow.c
by netsurf@semichrome.net
Author: tlsa
Date: Thu Feb 26 09:17:13 2009
New Revision: 6634
URL: http://source.netsurf-browser.org?rev=6634&view=rev
Log:
Tweak URL bar size and position.
Modified:
trunk/netsurf/framebuffer/fb_rootwindow.c
Modified: trunk/netsurf/framebuffer/fb_rootwindow.c
URL: http://source.netsurf-browser.org/trunk/netsurf/framebuffer/fb_rootwindow...
==============================================================================
--- trunk/netsurf/framebuffer/fb_rootwindow.c (original)
+++ trunk/netsurf/framebuffer/fb_rootwindow.c Thu Feb 26 09:17:13 2009
@@ -143,8 +143,8 @@
1, 0x00000000, false, false);
}
if (widget->text != NULL) {
- plot.text(fb_plot_ctx.x0 + 2,
- fb_plot_ctx.y0 + 15,
+ plot.text(fb_plot_ctx.x0 + 3,
+ fb_plot_ctx.y0 + 17,
&root_style,
widget->text,
strlen(widget->text),
@@ -243,7 +243,7 @@
new_widget->click = click_rtn;
new_widget->bitmap = widget_image;
-
+
fb_insert_widget(new_widget);
return new_widget;
@@ -420,7 +420,7 @@
fb->width -
(newwidget->x + newwidget->width + 5) -
(25 + 10),
- 22,
+ 24,
FB_COLOUR_WHITE, true,
fb_widget_url_input);
14 years, 6 months
r6632 vince - /trunk/netsurf/framebuffer/fb_32bpp_plotters.c
by netsurf@semichrome.net
Author: vince
Date: Thu Feb 26 08:35:14 2009
New Revision: 6632
URL: http://source.netsurf-browser.org?rev=6632&view=rev
Log:
rewrite the fb_32bpp_fill routine to be more efficient
Modified:
trunk/netsurf/framebuffer/fb_32bpp_plotters.c
Modified: trunk/netsurf/framebuffer/fb_32bpp_plotters.c
URL: http://source.netsurf-browser.org/trunk/netsurf/framebuffer/fb_32bpp_plot...
==============================================================================
--- trunk/netsurf/framebuffer/fb_32bpp_plotters.c (original)
+++ trunk/netsurf/framebuffer/fb_32bpp_plotters.c Thu Feb 26 08:35:14 2009
@@ -153,23 +153,29 @@
static bool fb_32bpp_fill(int x0, int y0, int x1, int y1, colour c)
{
int w;
- int y;
+ uint32_t *pvid_line;
uint32_t *pvid;
uint32_t ent;
+ uint32_t llen;
+ uint32_t width;
+ uint32_t height;
if (!fb_plotters_clip_rect_ctx(&x0, &y0, &x1, &y1))
return true; /* fill lies outside current clipping region */
+ llen = (framebuffer->linelen >> 2);
ent = ((c & 0xff0000) >> 16) | (c & 0xff00) | ((c & 0xff) << 16);
-
- pvid = fb_32bpp_get_xy_loc(x0, y0);
-
- for (y = y0; y < y1; y++) {
- w = x1 - x0;
- while (w-- > 0) {
- *(pvid + w) = ent;
- }
- pvid += (framebuffer->linelen >> 2);
+ width = x1 - x0;
+ height = y1 - y0;
+
+ pvid_line = fb_32bpp_get_xy_loc(x0, y0);
+
+ while (height > 0) {
+ height--;
+ pvid = pvid_line;
+ pvid_line += llen;
+ w = width;
+ while (w-- > 0) *pvid++ = ent;
}
return true;
@@ -193,7 +199,7 @@
{
int height = bp->rows;
int width = bp->width;
- uint32_t row;
+ uint32_t row = 0;
int xloop, yloop;
uint32_t *pvideo;
14 years, 6 months
r6631 dsilvers - in /trunk/netsurf: Makefile Makefile.resources Makefile.sources framebuffer/fb_convert_image.c framebuffer/fb_image_data.c
by netsurf@semichrome.net
Author: dsilvers
Date: Thu Feb 26 08:14:29 2009
New Revision: 6631
URL: http://source.netsurf-browser.org?rev=6631&view=rev
Log:
Add a resources Makefile, support host tools, and add support to build framebuffer assets from PNG resources
Added:
trunk/netsurf/Makefile.resources
trunk/netsurf/framebuffer/fb_convert_image.c
Removed:
trunk/netsurf/framebuffer/fb_image_data.c
Modified:
trunk/netsurf/Makefile
trunk/netsurf/Makefile.sources
Modified: trunk/netsurf/Makefile
URL: http://source.netsurf-browser.org/trunk/netsurf/Makefile?rev=6631&r1=6630...
==============================================================================
--- trunk/netsurf/Makefile (original)
+++ trunk/netsurf/Makefile Thu Feb 26 08:14:29 2009
@@ -110,6 +110,9 @@
TOUCH=touch
STRIP=strip
+# Override this only if the host compiler is called something different
+HOST_CC := gcc
+
ifeq ($(TARGET),riscos)
ifeq ($(HOST),riscos)
# Build for RO on RO
@@ -610,10 +613,17 @@
$(Q)$(MKDIR) $(DEPROOT)
$(Q)$(TOUCH) $(DEPROOT)/created
+TOOLROOT := $(OBJROOT)/tools
+$(TOOLROOT)/created: $(OBJROOT)/created
+ $(VQ)echo " MKDIR: $(TOOLROOT)"
+ $(Q)$(MKDIR) $(TOOLROOT)
+ $(Q)$(TOUCH) $(TOOLROOT)/created
+
CLEANS := clean-target
POSTEXES :=
+include Makefile.resources
include Makefile.sources
OBJECTS := $(sort $(addprefix $(OBJROOT)/,$(subst /,_,$(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(patsubst %.s,%.o,$(SOURCES)))))))
Added: trunk/netsurf/Makefile.resources
URL: http://source.netsurf-browser.org/trunk/netsurf/Makefile.resources?rev=66...
==============================================================================
--- trunk/netsurf/Makefile.resources (added)
+++ trunk/netsurf/Makefile.resources Thu Feb 26 08:14:29 2009
@@ -1,0 +1,45 @@
+# Makefile for NetSurf's resources
+#
+# Copyright 2009 Daniel Silverstone <dsilvers(a)netsurf-browser.org>
+#
+#
+# This file provides the rules and setup for built-in resources for
+# the NetSurf browser binary.
+
+ifeq ($(TARGET),framebuffer)
+
+# We make fb_convert_image depend on fb_bitmap.h so that if we change
+# that header, we get new images built just in case.
+$(TOOLROOT)/fb_convert_image: $(TOOLROOT)/created framebuffer/fb_convert_image.c framebuffer/fb_bitmap.h
+ $(VQ)echo " HOST CC: $@"
+ $(Q)$(HOST_CC) -o $@ framebuffer/fb_convert_image.c -lpng
+
+FB_IMAGE_left_arrow := framebuffer/res/icons/back.png
+FB_IMAGE_right_arrow := framebuffer/res/icons/forward.png
+FB_IMAGE_reload := framebuffer/res/icons/reload.png
+FB_IMAGE_stop_image := framebuffer/res/icons/stop.png
+
+FB_IMAGE_pointer_image := framebuffer/res/pointers/default.png
+FB_IMAGE_hand_image := framebuffer/res/pointers/point.png
+FB_IMAGE_caret_image := framebuffer/res/pointers/caret.png
+
+# 1: input file
+# 2: output file
+# 3: bitmap name
+define convert_image
+
+S_IMAGES += $(2)
+
+$(2): $(1) $(TOOLROOT)/fb_convert_image
+ $(Q)$(TOOLROOT)/fb_convert_image $(1) $(2) $(3)
+
+endef
+
+S_IMAGES :=
+
+$(eval $(foreach V,$(filter FB_IMAGE_%,$(.VARIABLES)),$(call convert_image,$($(V)),$(OBJROOT)/$(patsubst FB_IMAGE_%,%,$(V)).c,$(patsubst FB_IMAGE_%,%,$(V)))))
+
+
+
+# End of framebuffer resource definitions
+endif
Modified: trunk/netsurf/Makefile.sources
URL: http://source.netsurf-browser.org/trunk/netsurf/Makefile.sources?rev=6631...
==============================================================================
--- trunk/netsurf/Makefile.sources (original)
+++ trunk/netsurf/Makefile.sources Thu Feb 26 08:14:29 2009
@@ -94,7 +94,7 @@
thumbnail.c misc.c fb_bitmap.c fb_filetype.c login.c \
fb_cursor.c fb_plotters.c fb_8bpp_plotters.c \
fb_16bpp_plotters.c fb_32bpp_plotters.c fb_findfile.c \
- fb_rootwindow.c fb_image_data.c
+ fb_rootwindow.c
# fb_1bpp_plotters.c
S_FRAMEBUFFER += fb_font_$(NETSURF_FB_FONTLIB).c
@@ -204,7 +204,7 @@
endif
ifeq ($(TARGET),framebuffer)
-SOURCES := $(S_COMMON) $(S_IMAGE) $(S_BROWSER) $(S_FRAMEBUFFER)
+SOURCES := $(S_COMMON) $(S_IMAGE) $(S_BROWSER) $(S_FRAMEBUFFER) $(S_IMAGES)
EXETARGET := nsfb$(SUBTARGET)
endif
Added: trunk/netsurf/framebuffer/fb_convert_image.c
URL: http://source.netsurf-browser.org/trunk/netsurf/framebuffer/fb_convert_im...
==============================================================================
--- trunk/netsurf/framebuffer/fb_convert_image.c (added)
+++ trunk/netsurf/framebuffer/fb_convert_image.c Thu Feb 26 08:14:29 2009
@@ -1,0 +1,306 @@
+/*
+ * Copyright 2009 Daniel Silverstone <dsilvers(a)netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdbool.h>
+#include <errno.h>
+#include <stdio.h>
+#include <png.h>
+#include <stdlib.h>
+
+static png_structp png;
+static png_infop info;
+static int interlace;
+static size_t rowbytes;
+static int raw_width, raw_height;
+static int rowstride;
+static unsigned char *bitmap_data;
+static bool is_cursor = true;
+static int raw_hot_x, raw_hot_y;
+
+#define WIDTH (is_cursor?raw_width-1:raw_width)
+#define HEIGHT (is_cursor?raw_height-1:raw_height)
+
+#define HOT_X (is_cursor?raw_hot_x-1:0)
+#define HOT_Y (is_cursor?raw_hot_y-1:0)
+
+#define REAL(v) (is_cursor?v+1:v)
+
+#define PPIX_AT(x,y) ((bitmap_data + (rowstride * y)) + (x * 4))
+
+#define R_OFF 2
+#define G_OFF 1
+#define B_OFF 0
+#define A_OFF 3
+
+#define R_AT(x,y) *(PPIX_AT(x,y) + R_OFF)
+#define G_AT(x,y) *(PPIX_AT(x,y) + G_OFF)
+#define B_AT(x,y) *(PPIX_AT(x,y) + B_OFF)
+#define A_AT(x,y) *(PPIX_AT(x,y) + A_OFF)
+
+static void info_callback(png_structp png, png_infop info);
+static void row_callback(png_structp png, png_bytep new_row,
+ png_uint_32 row_num, int pass);
+static void end_callback(png_structp png, png_infop info);
+
+
+
+static void
+usage(void)
+{
+ fprintf(stderr, "usage: fb_convert_image input.png output.inc varname\n");
+}
+
+static void info_callback(png_structp png, png_infop info);
+static void row_callback(png_structp png, png_bytep new_row,
+ png_uint_32 row_num, int pass);
+static void end_callback(png_structp png, png_infop info);
+
+
+static void
+detect_hotspot(void)
+{
+ int i;
+ int greenpixels = 0;
+
+ for (i = 0; i < raw_width; ++i) {
+ if (A_AT(i, 0) == 255) {
+ if (G_AT(i, 0) == 255) {
+ greenpixels++;
+ raw_hot_x = i;
+ }
+ if ((B_AT(i, 0) != 0) || (R_AT(i, 0) != 0)) {
+ is_cursor = false;
+ return;
+ }
+ } else if (A_AT(i, 0) != 0) {
+ is_cursor = false;
+ return;
+ }
+ }
+ if (greenpixels != 1) {
+ is_cursor = false;
+ return;
+ }
+
+ for (i = 0; i < raw_height; ++i) {
+ if (A_AT(0, i) == 255) {
+ if (G_AT(0, i) == 255) {
+ greenpixels++;
+ raw_hot_y = i;
+ }
+ if ((B_AT(0, i) != 0) || (R_AT(0, i) != 0)) {
+ is_cursor = false;
+ return;
+ }
+ } else if (A_AT(0, i) != 0) {
+ is_cursor = false;
+ return;
+ }
+ }
+ if (greenpixels != 2) {
+ is_cursor = false;
+ return;
+ }
+ printf(" Pointer detected. Adjusted hotspot at %d, %d (0-based)\n",
+ raw_hot_x - 1, raw_hot_y - 1);
+}
+
+int
+main(int argc, char **argv)
+{
+ FILE *f;
+ unsigned char buffer[1024];
+ int br;
+ int x, y, c;
+
+ if (argc != 4) {
+ usage();
+ return 1;
+ }
+
+ printf(" CONVERT: %s (%s)\n", argv[1], argv[3]);
+
+ png = png_create_read_struct(PNG_LIBPNG_VER_STRING, 0, 0, 0);
+ info = png_create_info_struct(png);
+
+ png_set_progressive_read_fn(png, NULL, info_callback, row_callback, end_callback);
+
+ f = fopen(argv[1], "rb");
+ if (f == NULL) {
+ printf(" Unable to open %s\n", argv[1]);
+ return 1;
+ }
+
+ do {
+ br = fread(buffer, 1, 1024, f);
+ if (br > 0) {
+ png_process_data(png, info, buffer, br);
+ }
+ } while (br > 0);
+
+ if (br < 0) {
+ printf("Error reading input: %s\n", strerror(errno));
+ return 1;
+ }
+
+ fclose(f);
+
+ detect_hotspot();
+
+ f = fopen(argv[2], "w");
+ if (f == NULL) {
+ printf(" Unable to open %s\n", argv[2]);
+ return 2;
+ }
+
+ fprintf(f, "/* This file is auto-generated from %s\n", argv[1]);
+ fprintf(f, " *\n * Do not edit this file directly.\n */\n\n");
+ fprintf(f, "#include <sys/types.h>\n\n");
+ fprintf(f, "#include <stdint.h>\n\n");
+ fprintf(f, "#include \"framebuffer/fb_bitmap.h\"\n\n");
+
+ fprintf(f, "static uint8_t %s_pixdata[] = {\n", argv[3]);
+ for (y = 0; y < HEIGHT; ++y) {
+ unsigned char *rowptr = bitmap_data + (rowstride * y);
+ if (is_cursor) {
+ /* If it's a cursor, skip one row and one column */
+ rowptr += rowstride + 4;
+ }
+ fprintf(f, "\t");
+ for (x = 0; x < WIDTH; ++x) {
+ for (c = 0; c < 4; ++c) {
+ unsigned char b = *rowptr++;
+ fprintf(f, "0x%02x, ", b);
+ }
+ }
+ fprintf(f, "\n");
+ }
+ fprintf(f, "};\n\n");
+
+ fprintf(f, "struct bitmap %s = {\n", argv[3]);
+ fprintf(f, "\t.width\t\t= %d,\n", WIDTH);
+ fprintf(f, "\t.height\t\t= %d,\n", HEIGHT);
+ fprintf(f, "\t.hot_x\t\t= %d,\n", HOT_X);
+ fprintf(f, "\t.hot_y\t\t= %d,\n", HOT_Y);
+ fprintf(f, "\t.pixdata\t= %s_pixdata,\n", argv[3]);
+
+ fprintf(f, "};\n\n");
+ fclose(f);
+
+ return 0;
+}
+
+static void
+info_callback(png_structp png, png_infop info)
+{
+ int bit_depth, color_type, interlace, intent;
+ double gamma;
+ unsigned long width, height;
+
+ /* Read the PNG details */
+ png_get_IHDR(png, info, &width, &height, &bit_depth,
+ &color_type, &interlace, 0, 0);
+
+ /* Set up our transformations */
+ if (color_type == PNG_COLOR_TYPE_PALETTE)
+ png_set_palette_to_rgb(png);
+ if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8)
+ png_set_gray_1_2_4_to_8(png);
+ if (png_get_valid(png, info, PNG_INFO_tRNS))
+ png_set_tRNS_to_alpha(png);
+ if (bit_depth == 16)
+ png_set_strip_16(png);
+ if (color_type == PNG_COLOR_TYPE_GRAY ||
+ color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
+ png_set_gray_to_rgb(png);
+ if (!(color_type & PNG_COLOR_MASK_ALPHA))
+ png_set_filler(png, 0xff, PNG_FILLER_AFTER);
+ /* gamma correction - we use 2.2 as our screen gamma
+ * this appears to be correct (at least in respect to !Browse)
+ * see http://www.w3.org/Graphics/PNG/all_seven.html for a test case
+ */
+ if (png_get_sRGB(png, info, &intent))
+ png_set_gamma(png, 2.2, 0.45455);
+ else {
+ if (png_get_gAMA(png, info, &gamma))
+ png_set_gamma(png, 2.2, gamma);
+ else
+ png_set_gamma(png, 2.2, 0.45455);
+ }
+
+
+ png_read_update_info(png, info);
+
+ rowbytes = png_get_rowbytes(png, info);
+ interlace = (interlace == PNG_INTERLACE_ADAM7);
+ raw_width = width;
+ raw_height = height;
+
+ rowstride = raw_width * 4;
+ bitmap_data = malloc(rowstride * raw_height);
+}
+
+static unsigned int interlace_start[8] = {0, 16, 0, 8, 0, 4, 0};
+static unsigned int interlace_step[8] = {28, 28, 12, 12, 4, 4, 0};
+static unsigned int interlace_row_start[8] = {0, 0, 4, 0, 2, 0, 1};
+static unsigned int interlace_row_step[8] = {8, 8, 8, 4, 4, 2, 2};
+
+static void
+row_callback(png_structp png, png_bytep new_row,
+ png_uint_32 row_num, int pass)
+{
+ unsigned long i, j;
+ unsigned int start, step;
+ unsigned char *row = bitmap_data + (rowstride * row_num);
+
+ if (new_row == 0)
+ return;
+
+ if (interlace) {
+ start = interlace_start[pass];
+ step = interlace_step[pass];
+ row_num = interlace_row_start[pass] +
+ interlace_row_step[pass] * row_num;
+
+ /* Copy the data to our current row taking interlacing
+ * into consideration */
+ row = bitmap_data + (rowstride * row_num);
+ for (j = 0, i = start; i < rowbytes; i += step) {
+ row[i++] = new_row[j++];
+ row[i++] = new_row[j++];
+ row[i++] = new_row[j++];
+ row[i++] = new_row[j++];
+ }
+ } else {
+ memcpy(row, new_row, rowbytes);
+ }
+}
+
+static void
+end_callback(png_structp png, png_infop info)
+{
+}
+
+
+
+/*
+ * Local Variables:
+ * c-basic-offset:8
+ * End:
+ */
+
Removed: trunk/netsurf/framebuffer/fb_image_data.c
URL: http://source.netsurf-browser.org/trunk/netsurf/framebuffer/fb_image_data...
==============================================================================
--- trunk/netsurf/framebuffer/fb_image_data.c (original)
+++ trunk/netsurf/framebuffer/fb_image_data.c (removed)
@@ -1,589 +1,0 @@
-/*
- * Copyright 2008 Vincent Sanders <vince(a)simtec.co.uk>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <stdint.h>
-
-#include "framebuffer/fb_image_data.h"
-#include "framebuffer/fb_bitmap.h"
-
-struct bitmap pointer_image = {
- .width = 12,
- .height = 22,
- .hot_x = 0,
- .hot_y = 0,
- .pixdata = (uint8_t *)
- "33L\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0""33L\37733L\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""33L\377\273\273\324\3773"
- "3L\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0""33L\377\360\360\377\377\273\273\324\37733L\377\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""33L\377\360\360\377\377\360"
- "\360\377\377\273\273\324\37733L\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0""33L\377\360\360\377\377\360\360\377\377\360\360\377\377"
- "\273\273\324\37733L\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""3"
- "3L\377\360\360\377\377\360\360\377\377\360\360\377\377\360\360\377\377\273"
- "\273\324\37733L\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""33L\377\360"
- "\360\377\377\360\360\377\377\360\360\377\377\360\360\377\377\360\360\377"
- "\377\273\273\324\37733L\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""33L\377\360"
- "\360\377\377\360\360\377\377\360\360\377\377\360\360\377\377\360\360\377"
- "\377\360\360\377\377\273\273\324\37733L\377\0\0\0\0\0\0\0\0\0\0\0\0""33L"
- "\377\360\360\377\377\360\360\377\377\360\360\377\377\360\360\377\377\360"
- "\360\377\377\360\360\377\377\360\360\377\377\273\273\324\37733L\377\0\0\0"
- "\0\0\0\0\0""33L\377\360\360\377\377\360\360\377\377\360\360\377\377\360\360"
- "\377\377\360\360\377\377\360\360\377\377\360\360\377\377\360\360\377\377"
- "\273\273\324\37733L\377\0\0\0\0""33L\377\360\360\377\377\360\360\377\377"
- "\360\360\377\377\360\360\377\377\273\273\324\37733L\37733L\37733L\37733L"
- "\37733L\37733L\37733L\377\360\360\377\377\360\360\377\377\273\273\324\377"
- "\360\360\377\377\360\360\377\377\273\273\324\37733L\377\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0""33L\377\360\360\377\377\273\273\324\37733L\37733L\377\360"
- "\360\377\377\360\360\377\37733L\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""33L"
- "\377\273\273\324\37733L\377\0\0\0\0""33L\377\273\273\324\377\360\360\377"
- "\377\273\273\324\37733L\377\0\0\0\0\0\0\0\0\0\0\0\0""33L\37733L\377\0\0\0"
- "\0\0\0\0\0\0\0\0\0""33L\377\360\360\377\377\360\360\377\37733L\377\0\0\0"
- "\0\0\0\0\0\0\0\0\0""33L\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""33L\377\273"
- "\273\324\377\360\360\377\377\273\273\324\37733L\377\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""33L\377\360\360\377\377\360\360"
- "\377\37733L\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0""33L\377\273\273\324\377\360\360\377\377\273\273\324\37733L\377\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""33L\377\360"
- "\360\377\377\360\360\377\37733L\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0""33L\377\273\273\324\377\360\360\377\37733L\377"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- """33L\37733L\37733L\377\0\0\0\0",
-};
-
-struct bitmap caret_image = {
- .width = 7,
- .height = 19,
- .hot_x = 0,
- .hot_y = 0,
- .pixdata = (uint8_t *)
- "33L\37733L\37733L\377\0\0\0\0""33L\37733L\37733L\37733L\377\273\273\324\377"
- "\360\360\377\37733L\377\360\360\377\377\273\273\324\37733L\377\0\0\0\0""3"
- "3L\377\273\273\324\377\360\360\377\377\273\273\324\37733L\377\0\0\0\0\0\0"
- "\0\0\0\0\0\0""33L\377\273\273\324\37733L\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0""33L\377\360\360\377\37733L\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""33"
- "L\377\360\360\377\37733L\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""33L\377\360"
- "\360\377\37733L\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""33L\377\360\360\377"
- "\37733L\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""33L\377\360\360\377\37733L\377"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""33L\377\360\360\377\37733L\377\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0""33L\377\360\360\377\37733L\377\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0""33L\377\360\360\377\37733L\377\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0""33L\377\360\360\377\37733L\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- """33L\377\360\360\377\37733L\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""33L\377"
- "\360\360\377\37733L\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""33L\377\273\273"
- "\324\37733L\377\0\0\0\0\0\0\0\0\0\0\0\0""33L\377\273\273\324\377\360\360"
- "\377\377\273\273\324\37733L\377\0\0\0\0""33L\377\273\273\324\377\360\360"
- "\377\37733L\377\360\360\377\377\273\273\324\37733L\37733L\37733L\37733L\377"
- "\0\0\0\0""33L\37733L\37733L\377",
-};
-
-struct bitmap hand_image = {
- .width = 16,
- .height = 22,
- .hot_x = 0,
- .hot_y = 0,
- .pixdata = (uint8_t *)
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""33L\37733L\377\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0""33L\377\273\273\324\377\273\273\324\37733L\377\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0""33L\377\273\273\324\377\273\273\324\37733L\377\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0""33L\377\360\360\377\377\360\360\377\37733L\377\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0""33L\377\360\360\377\377\360\360\377\37733L\377\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0""33L\377\360\360\377\377\360\360\377\37733L\37733L\37733L\377\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0""33L\377\360\360\377\377\360\360\377\37733L\377\273\273\324\377\273"
- "\273\324\37733L\37733L\37733L\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0""33L\377\360\360\377\377\360\360\377\37733L\377\360\360"
- "\377\377\360\360\377\37733L\377\273\273\324\377\273\273\324\37733L\377\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""33L\377\360\360\377\377\360"
- "\360\377\37733L\377\360\360\377\377\360\360\377\37733L\377\360\360\377\377"
- "\360\360\377\37733L\37733L\37733L\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""3"
- "3L\377\360\360\377\377\360\360\377\37733L\377\360\360\377\377\360\360\377"
- "\37733L\377\360\360\377\377\360\360\377\37733L\377\273\273\324\377\273\273"
- "\324\37733L\377\0\0\0\0\0\0\0\0\0\0\0\0""33L\377\360\360\377\377\360\360"
- "\377\37733L\377\360\360\377\377\360\360\377\37733L\377\360\360\377\377\360"
- "\360\377\37733L\377\360\360\377\377\360\360\377\37733L\377\0\0\0\0""33L\377"
- "33L\37733L\377\360\360\377\377\360\360\377\37733L\377\360\360\377\377\360"
- "\360\377\37733L\377\360\360\377\377\360\360\377\37733L\377\360\360\377\377"
- "\360\360\377\37733L\37733L\377\360\360\377\377\273\273\324\37733L\377\360"
- "\360\377\377\360\360\377\377\360\360\377\377\360\360\377\377\360\360\377"
- "\377\360\360\377\377\360\360\377\377\360\360\377\377\360\360\377\377\360"
- "\360\377\377\360\360\377\37733L\37733L\377\360\360\377\377\360\360\377\377"
- "33L\377\360\360\377\377\360\360\377\377\360\360\377\377\360\360\377\377\360"
- "\360\377\377\360\360\377\377\360\360\377\377\360\360\377\377\360\360\377"
- "\377\360\360\377\377\360\360\377\37733L\37733L\377\360\360\377\377\360\360"
- "\377\37733L\377\360\360\377\377\360\360\377\377\360\360\377\377\360\360\377"
- "\377\360\360\377\377\360\360\377\377\360\360\377\377\360\360\377\377\360"
- "\360\377\377\360\360\377\377\360\360\377\37733L\37733L\377\360\360\377\377"
- "\360\360\377\377\360\360\377\377\360\360\377\377\360\360\377\377\360\360"
- "\377\377\360\360\377\377\360\360\377\377\360\360\377\377\360\360\377\377"
- "\360\360\377\377\360\360\377\377\360\360\377\377\360\360\377\37733L\3773"
- "3L\377\360\360\377\377\360\360\377\377\360\360\377\377\360\360\377\377\360"
- "\360\377\377\360\360\377\377\360\360\377\377\360\360\377\377\360\360\377"
- "\377\360\360\377\377\360\360\377\377\360\360\377\377\360\360\377\377\360"
- "\360\377\37733L\37733L\377\273\273\324\377\360\360\377\377\360\360\377\377"
- "\360\360\377\377\360\360\377\377\360\360\377\377\360\360\377\377\360\360"
- "\377\377\360\360\377\377\360\360\377\377\360\360\377\377\360\360\377\377"
- "\360\360\377\377\360\360\377\37733L\377\0\0\0\0""33L\377\273\273\324\377"
- "\360\360\377\377\360\360\377\377\360\360\377\377\360\360\377\377\360\360"
- "\377\377\360\360\377\377\360\360\377\377\360\360\377\377\360\360\377\377"
- "\360\360\377\377\360\360\377\377\273\273\324\37733L\377\0\0\0\0\0\0\0\0""3"
- "3L\377\273\273\324\377\360\360\377\377\360\360\377\377\360\360\377\377\360"
- "\360\377\377\360\360\377\377\360\360\377\377\360\360\377\377\360\360\377"
- "\377\360\360\377\377\273\273\324\37733L\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0""33L\377\273\273\324\377\360\360\377\377\360\360\377\377\360\360\377\377"
- "\360\360\377\377\360\360\377\377\360\360\377\377\360\360\377\377\273\273"
- "\324\37733L\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""33L\377"
- "33L\37733L\37733L\37733L\37733L\37733L\37733L\37733L\377\0\0\0\0\0\0\0\0"
- "\0\0\0\0",
-};
-
-struct bitmap left_arrow = {
- .width = 22,
- .height = 25,
- .hot_x = 0,
- .hot_y = 0,
- .pixdata = (uint8_t *)
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\0\10\0\14\0\10\0\206\0\11\0\350\0\10\0.\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0"
- "\0\10\0\1\0\10\0]\0\12\0\347\0\10\0\377\0\10\0\377\0\10\0W\377\377\377\0"
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\0\10\0""5\0\11\0\310\0\10"
- "\0\377\0)\3\375\0|\12\377\0\10\0\377\0\10\0W\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\0\10\0\30\0\10\0\237\0\10\0\376\0\23\1\375\0\215\14\377\0\371\25\377"
- "\0\301\20\377\0\10\0\377\0\10\0W\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0\377\377\377\0\0\10\0\6\0\10\0u\0\12\0\364\0"
- "\11\0\377\0d\10\377\0\350\24\377\0\377\26\377\0\377\26\377\0\301\20\377\0"
- "\10\0\377\0\10\0V\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\0\10\0L\0\12\0\334\0\10\0\377\0<\5\376\0\313\21\377\0\377\26\377"
- "\0\377\26\377\0\377\26\377\0\377\26\377\0\301\20\377\0\10\0\377\0\10\0V\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\0\10\0(\0\10\0\267\0\10\0\377\0\36\2\375"
- "\0\244\16\377\0\376\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26"
- "\377\0\377\26\377\0\301\20\377\0\10\0\377\0\10\0V\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\0\10\0\17\0\10"
- "\0\216\0\11\0\373\0\15\0\376\0|\12\377\0\363\25\377\0\377\26\377\0\377\26"
- "\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\301"
- "\20\377\0\10\0\377\0\10\0U\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\0\10\0\2\0\10\0e\0\12\0\354\0\10\0\377\0T\7\377\0\335\23\377\0"
- "\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26"
- "\377\0\377\26\377\0\377\26\377\0\377\26\377\0\301\20\377\0\10\0\377\0\10"
- "\0U\377\377\377\0\377\377\377\0\377\377\377\0\0\10\0<\0\12\0\320\0\10\0\377"
- "\0/\3\375\0\274\20\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377"
- "\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26"
- "\377\0\377\26\377\0\301\20\377\0\10\0\377\0\10\0T\377\377\377\0\0\10\0\35"
- "\0\10\0\247\0\10\0\377\0\26\1\375\0\223\14\377\0\373\26\377\0\377\26\377"
- "\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26"
- "\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\301"
- "\20\377\0\10\0\377\0\10\0T\0\10\0m\0\12\0\367\0\11\0\376\0l\11\377\0\354"
- "\24\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377"
- "\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26"
- "\377\0\377\26\377\0\377\26\377\0\377\26\377\0\301\20\377\0\10\0\377\0\10"
- "\0T\0\11\0\331\0\10\0\377\0=\5\377\0\340\23\377\0\377\26\377\0\377\26\377"
- "\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26"
- "\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377"
- "\26\377\0\377\26\377\0\301\20\377\0\10\0\377\0\10\0S\0\10\0\21\0\10\0\222"
- "\0\11\0\374\0\16\1\376\0\200\13\377\0\364\25\377\0\377\26\377\0\377\26\377"
- "\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26"
- "\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\301"
- "\20\377\0\10\0\377\0\10\0S\377\377\377\0\377\377\377\0\0\10\0+\0\11\0\275"
- "\0\10\0\377\0\40\2\375\0\250\16\377\0\377\26\377\0\377\26\377\0\377\26\377"
- "\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26"
- "\377\0\377\26\377\0\377\26\377\0\377\26\377\0\301\20\377\0\10\0\377\0\10"
- "\0S\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\0\10\0Q\0\12"
- "\0\340\0\10\0\377\0@\5\376\0\316\22\377\0\377\26\377\0\377\26\377\0\377\26"
- "\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377"
- "\26\377\0\377\26\377\0\301\20\377\0\10\0\377\0\10\0R\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\0\10\0\10\0\10\0{\0\12\0"
- "\366\0\11\0\376\0h\11\377\0\352\24\377\0\377\26\377\0\377\26\377\0\377\26"
- "\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\301"
- "\20\377\0\10\0\377\0\10\0R\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\0\10\0\33\0\10\0\245"
- "\0\10\0\377\0\24\1\375\0\221\14\377\0\372\26\377\0\377\26\377\0\377\26\377"
- "\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\301\20\377\0\10\0"
- "\377\0\10\0R\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\0\10\0"
- ":\0\12\0\315\0\10\0\377\0,\3\375\0\270\20\377\0\377\26\377\0\377\26\377\0"
- "\377\26\377\0\377\26\377\0\377\26\377\0\301\20\377\0\10\0\377\0\10\0Q\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\0\10\0\2\0"
- "\10\0c\0\12\0\353\0\10\0\377\0P\6\377\0\332\23\377\0\377\26\377\0\377\26"
- "\377\0\377\26\377\0\301\20\377\0\10\0\377\0\10\0Q\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\0"
- "\10\0\17\0\10\0\215\0\11\0\373\0\15\0\376\0x\12\377\0\361\25\377\0\377\26"
- "\377\0\301\20\377\0\10\0\377\0\10\0Q\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0"
- "\377\377\377\0\0\10\0'\0\10\0\267\0\10\0\377\0\34\2\375\0\241\16\377\0\300"
- "\20\377\0\10\0\377\0\10\0P\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\0\10\0L\0\12\0\334\0\10\0\377\0!\2\376\0\10"
- "\0\377\0\10\0P\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\0\10\0\6\0\10\0v\0\12\0\364\0\10\0\377\0\10"
- "\0N\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\0\10\0\30\0\10\0g\0\10\0"
- "\6",
-};
-
-struct bitmap right_arrow = {
- .width = 22,
- .height = 25,
- .hot_x = 0,
- .hot_y = 0,
- .pixdata = (uint8_t *)
- "\0\10\0""0\0\11\0\350\0\10\0\206\0\10\0\14\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0"
- "\0\10\0W\0\10\0\377\0\10\0\377\0\13\0\347\0\10\0]\0\10\0\1\377\377\377\0"
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\0\10\0W\0"
- "\10\0\377\0|\12\377\0)\3\375\0\10\0\377\0\12\0\311\0\10\0""6\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\0\10\0W\0\10\0\377\0"
- "\301\20\377\0\371\25\377\0\215\14\377\0\23\1\375\0\10\0\376\0\10\0\240\0"
- "\10\0\31\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\0\10\0V\0\10\0\377\0\301\20"
- "\377\0\377\26\377\0\377\26\377\0\350\24\377\0d\10\377\0\11\0\377\0\12\0\364"
- "\0\10\0w\0\10\0\6\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\0\10\0V\0\10\0\377\0\301\20\377\0\377\26\377\0\377"
- "\26\377\0\377\26\377\0\377\26\377\0\313\21\377\0<\5\376\0\10\0\377\0\12\0"
- "\336\0\10\0N\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\0\10\0V\0\10\0\377\0\301\20\377\0\377\26\377\0\377\26\377\0\377\26"
- "\377\0\377\26\377\0\377\26\377\0\376\26\377\0\244\16\377\0\36\2\375\0\10"
- "\0\377\0\11\0\273\0\10\0*\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\0\10\0U\0"
- "\10\0\377\0\301\20\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377"
- "\0\377\26\377\0\377\26\377\0\377\26\377\0\363\25\377\0|\12\377\0\15\0\376"
- "\0\11\0\374\0\10\0\221\0\10\0\21\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\0\10\0U\0\10\0\377\0\301\20"
- "\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377"
- "\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\335\23\377\0T\7\377\0\10"
- "\0\377\0\12\0\355\0\10\0h\0\10\0\3\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\0\10\0T\0\10\0\377\0\301\20\377\0\377\26\377\0\377\26\377"
- "\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26"
- "\377\0\377\26\377\0\377\26\377\0\377\26\377\0\274\20\377\0/\4\375\0\10\0"
- "\377\0\12\0\322\0\10\0@\377\377\377\0\377\377\377\0\377\377\377\0\0\10\0"
- "T\0\10\0\377\0\301\20\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26"
- "\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377"
- "\26\377\0\377\26\377\0\377\26\377\0\373\26\377\0\223\14\377\0\26\1\375\0"
- "\10\0\377\0\10\0\253\0\10\0\37\377\377\377\0\0\10\0T\0\10\0\377\0\301\20"
- "\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377"
- "\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377"
- "\0\377\26\377\0\377\26\377\0\377\26\377\0\354\24\377\0l\11\377\0\11\0\376"
- "\0\11\0\370\0\10\0u\0\10\0S\0\10\0\377\0\301\20\377\0\377\26\377\0\377\26"
- "\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377"
- "\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377"
- "\0\377\26\377\0\377\26\377\0\340\23\377\0=\5\377\0\10\0\377\0\11\0\327\0"
- "\10\0S\0\10\0\377\0\301\20\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377"
- "\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377"
- "\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\364\25\377\0\200\13"
- "\377\0\16\1\376\0\11\0\375\0\10\0\227\0\10\0\23\0\10\0S\0\10\0\377\0\301"
- "\20\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377"
- "\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26"
- "\377\0\377\26\377\0\250\16\377\0\40\2\375\0\10\0\377\0\11\0\301\0\10\0/\377"
- "\377\377\0\377\377\377\0\0\10\0R\0\10\0\377\0\301\20\377\0\377\26\377\0\377"
- "\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377"
- "\0\377\26\377\0\377\26\377\0\377\26\377\0\316\22\377\0@\5\376\0\10\0\377"
- "\0\12\0\342\0\10\0U\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\0\10\0R\0\10\0\377\0\301\20\377\0\377\26\377\0\377\26\377\0\377\26\377"
- "\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\352\24"
- "\377\0h\11\377\0\11\0\376\0\12\0\367\0\10\0~\0\10\0\11\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\0\10\0R\0\10\0\377\0"
- "\301\20\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26"
- "\377\0\377\26\377\0\372\26\377\0\221\14\377\0\24\1\375\0\10\0\377\0\10\0"
- "\247\0\10\0\35\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\0\10\0Q\0\10\0\377\0\301\20\377\0"
- "\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\377\26\377\0\270\20"
- "\377\0,\3\375\0\10\0\377\0\12\0\317\0\10\0=\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\0\10\0Q\0\10\0\377\0\301\20\377\0\377\26\377\0\377\26"
- "\377\0\377\26\377\0\332\23\377\0P\6\377\0\10\0\377\0\12\0\354\0\10\0e\0\10"
- "\0\2\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0"
- "\0\10\0Q\0\10\0\377\0\301\20\377\0\377\26\377\0\361\25\377\0x\12\377\0\15"
- "\0\376\0\11\0\374\0\10\0\217\0\10\0\17\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\0\10\0P\0\10\0"
- "\377\0\300\20\377\0\241\16\377\0\34\2\375\0\10\0\377\0\10\0\270\0\10\0(\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\0\10\0P\0\10\0\377\0!\2\376"
- "\0\10\0\377\0\12\0\335\0\10\0M\377\377\377\0\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\0\10\0K\0\10\0\377\0\12\0\364\0\10\0v"
- "\0\10\0\6\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0\0\10\0\10\0\10\0j\0\10\0\30\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0",
-};
-
-struct bitmap reload = {
- .width = 24,
- .height = 25,
- .hot_x = 0,
- .hot_y = 0,
- .pixdata = (uint8_t *)
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\0\10\0"
- "\36\0\10\0O\0\10\0H\0\10\0!\0\10\0\2\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0\0\10\0\5\0\10\0r\0\10\0\271\0\10\0\353\0\10"
- "\0\377\0\10\0\377\0\10\0\377\0\10\0\377\0\10\0\370\0\10\0\263\0\10\0""6\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\0\10\0.\0\10\0\317\0\10\0\377\0\10\0\341\0\10\0\255\0\10"
- "\0z\0\10\0I\0\10\0Q\0\10\0v\0\10\0\241\0\10\0\366\0\10\0\377\0\10\0\267\0"
- "\10\0\40\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\0\10\0|\0"
- "\10\0\372\0\10\0\361\0\10\0e\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0\0\10\0\0"
- "\0\10\0\0\0\10\0\0\0\10\0\27\0\10\0\214\0\10\0\370\0\10\0\343\0\10\0&\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\0\10\0i\0\10\0\377\0\10\0\272\0\10\0\36\0\10\0\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\0\10\0\0\0\10\0\0\0\10\0D\0\10\0\365\0\10\0\350\0\10"
- "\0)\377\377\377\0\377\377\377\0\0\0\0\"\377\377\377\0\377\377\377\0\0\10"
- "\0\"\0\10\0\364\0\10\0\312\0\10\0\3\0\10\0\0\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\0\10\0\0\0\10\0>\0\10\0\366\0\7\0"
- "\306\0\0\0n\0\0\0\330\0\0\0\366\377\377\377\0\0\10\0\2\0\10\0\301\0\10\0"
- "\367\0\10\0)\0\10\0\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0\0\0\0\6\0\0\0S\0\1\0\342\0\1\0\377\0\0\0\373"
- "\0\0\0\377\0\0\0\333\377\377\377\0\0\10\0O\0\10\0\377\0\10\0u\0\10\0\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\0\0\0\2\0\0\0\267\0\0\0\366\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
- "\0\0\260\377\377\377\0\0\10\0\207\0\10\0\377\0\10\0\25\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\0\0\0\0\0\0\0\7\0\0\0\261\0\0\0\357\0\0\0\377\0\0\0\377\0\0\0\375\0\0"
- "\0t\377\377\377\0\0\10\0\272\0\10\0\341\0\10\0\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\204\0\0\0\354\0\0\0\377\0\0\0\355\0\0\0"
- "C\377\377\377\0\0\10\0\354\0\10\0\254\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0\377\377\377\0\0\0\0\0\0\0\0U\0\0\0\352\0\0\0"
- "\356\0\0\0\26\0\10\0\40\0\10\0\377\0\10\0x\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\0\0\0\0\0\0\0"
- """1\0\0\0\324\0\0\0\0\0\10\0\7\0\10\0C\0\10\0\"\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\0\0\0\0\0\0\0\10\377\377\377\0\0\10\0\0\0\0\0""8\0\0\0\6\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\0\10\0\13\0\10\0\266\0\10\0I\377\377\377\0\0\0\0\273"
- "\0\0\0\322\0\0\0\24\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\0\10\0;\0\10\0\377\0\10\0\\\377\377"
- "\377\0\0\0\0\340\0\0\0\375\0\0\0\341\0\0\0+\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\0\10\0p\0\10\0\377\0\10\0*\0"
- "\0\0\10\0\0\0\347\0\0\0\377\0\0\0\377\0\0\0\350\0\0\0L\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\0\10\0\244\0\10\0\364\0\10\0"
- "\2\0\0\0""1\0\0\0\351\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\353\0\0\0x\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\0\10\0\333\0\10\0\304\0\10\0"
- "\0\0\0\0_\0\0\0\370\0\0\0\377\0\0\0\377\0\0\0\374\0\0\0\352\0\0\0\301\0\0"
- "\0\35\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0\0\10\0d\0\10\0\377\0\10\0w\377\377\377\0\0\0"
- "\0\232\0\0\0\376\0\0\0\353\0\1\0\367\0\4\0\367\0\4\0)\0\0\0\0\0\0\0\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\0\10\0\37\0\10\0\362\0\10\0\315\0\10\0\4\377\377\377\0\0\0\0\236\0\0\0"
- "\217\0\0\0&\0\10\0>\0\10\0\376\0\10\0\320\0\10\0\25\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\0\10\0\12\0\10"
- "\0\277\0\10\0\371\0\10\0,\0\10\0\0\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\10\0\0\0\10\0c\0\10\0\375\0\10\0\325\0\10\0\36\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0\0\10\0<\0\10\0\333\0\10\0\377\0\10\0s\0\10\0"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0"
- "\377\377\377\0\0\10\0\0\0\10\0Z\0\10\0\373\0\10\0\370\0\10\0\226\0\10\0\35"
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\0\10\0\5\0\10\0"
- """0\0\10\0\220\0\10\0\375\0\10\0\351\0\10\0S\0\10\0\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\0\10\0\0\0\10\0/\0\10\0\256\0\10\0\376\0\10\0\376\0\10\0"
- "\341\0\10\0\274\0\10\0\242\0\10\0\312\0\10\0\370\0\10\0\377\0\10\0\377\0"
- "\10\0\252\0\10\0\24\0\10\0\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\0\10\0\0\0\10\0\0\0\10\0.\0\10\0\215\0\10\0\265\0\10"
- "\0\334\0\10\0\366\0\10\0\320\0\10\0\234\0\10\0i\0\10\0""1\0\10\0\0\0\10\0"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0",
-};
-
-struct bitmap stop_image = {
- .width = 25,
- .height = 25,
- .hot_x = 0,
- .hot_y = 0,
- .pixdata = (uint8_t *)
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\0\0M\377\0\0\322\377\0\0\374\377\0\0\371\377\0\0\306\377\0\0=\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\0\0<\377\0\0\257\377\0\0\374\377\0\0\377\377\0\0\377\377"
- "\0\0\377\377\0\0\376\377\0\0\263\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\0\0@\377\0\0\277\377\0\0\377\377\0\0\277"
- "\377\0\0@\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\0\0\257\377\0\0\373\377\0\0\377\377"
- "\0\0\377\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\365\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\0\0\277\377\0\0"
- "\377\377\0\0\377\377\0\0\377\377\0\0\346\377\0\0""3\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\0\0<\377\0\0\257\377\0\0\376\377\0"
- "\0\377\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\377\377\0"
- "\0\323\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\355"
- "\377\0\0Y\377\0\0\14\377\377\377\0\377\0\0\40\377\0\0\315\377\0\0\375\377"
- "\0\0\377\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\377\377"
- "\0\0\356\377\0\0a\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\0\0\277\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\377"
- "\377\0\0\377\377\0\0\371\377\0\0\246\377\0\0\\\377\0\0\327\377\0\0\377\377"
- "\0\0\377\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\376\377\0\0\344\377"
- "\0\0\216\377\0\0@\377\0\0\15\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\0\0@\377\0\0\362\377\0\0\377\377\0\0\377\377"
- "\0\0\377\377\0\0\377\377\0\0\377\377\0\0\375\377\0\0\370\377\0\0\377\377"
- "\0\0\377\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\375\377\0\0\233\377"
- "\0\0\40\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\0\0Y\377\0"
- "\0\352\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\377\377\0"
- "\0\377\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\377\377\0"
- "\0\277\377\0\0\40\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\0\0\15\377\0\0Q\377\0\0\342\377\0\0\377\377\0\0\377\377\0"
- "\0\377\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\377\377\0"
- "\0\377\377\0\0\315\377\0\0\40\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\0\0""3"
- "\377\0\0\335\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\377"
- "\377\0\0\377\377\0\0\377\377\0\0\371\377\0\0T\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\0\0\14\377\0\0\306\377\0\0\377\377\0\0\377\377\0"
- "\0\377\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\377\377\0"
- "\0\257\377\0\0\40\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\0\0\\\377\0\0\373"
- "\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\377"
- "\377\0\0\377\377\0\0\377\377\0\0\376\377\0\0\315\377\0\0<\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\0\0\40"
- "\377\0\0\345\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\377"
- "\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\377"
- "\377\0\0\345\377\0\0*\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0"
- "\377\0\0\14\377\0\0\227\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\377\377"
- "\0\0\377\377\0\0\351\377\0\0\313\377\0\0\375\377\0\0\377\377\0\0\377\377"
- "\0\0\377\377\0\0\377\377\0\0\377\377\0\0\207\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\0\0Q\377\0\0\366\377\0\0\377\377\0\0\377\377"
- "\0\0\377\377\0\0\377\377\0\0\364\377\0\0""3\377\0\0\40\377\0\0\257\377\0"
- "\0\377\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\356\377\0"
- "\0<\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0\377\0\0\40\377\0\0\326\377\0\0\377\377\0\0\377"
- "\377\0\0\377\377\0\0\377\377\0\0\376\377\0\0\207\377\377\377\0\377\377\377"
- "\0\377\0\0\40\377\0\0\367\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\377"
- "\377\0\0\377\377\0\0\276\377\0\0\14\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\0\0\177\377\0\0\375\377"
- "\0\0\377\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\326\377\0\0\40\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\0\0\235\377\0\0\376\377\0\0\377\377"
- "\0\0\377\377\0\0\377\377\0\0\377\377\0\0\374\377\0\0f\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\0\0\20\377\0\0\342\377"
- "\0\0\377\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\367\377\0\0Q\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\0\0\40\377\0\0\315\377"
- "\0\0\377\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\335\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\0"
- "\0@\377\0\0\374\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\253"
- "\377\0\0\14\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\0\0<\377\0\0\362\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\377"
- "\377\0\0\375\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\0\0o\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\377\377\0"
- "\0\377\377\0\0@\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\0\0\177\377\0\0\377\377\0\0\377"
- "\377\0\0\377\377\0\0\377\377\0\0\377\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\0\0o\377\0\0\374\377\0\0\377\377\0"
- "\0\377\377\0\0\377\377\0\0\350\377\0\0\14\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\0"
- "\0\40\377\0\0\352\377\0\0\377\377\0\0\377\377\0\0\377\377\0\0\333\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\0\0@\377"
- "\0\0\303\377\0\0\373\377\0\0\377\377\0\0\353\377\0\0p\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\0\0J\377\0\0\310\377\0\0\377\377\0\0\310"
- "\377\0\0J\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\0\0\20\377\0\0@\377\0\0o\377\0\0o\377\0\0@\377\0\0\20\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377"
- "\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0"
- "\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377"
- "\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377"
- "\377\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0",
-};
14 years, 6 months