diff options
-rw-r--r-- | doc/src/declarative/qmlwebkit.qdoc | 4 | ||||
-rw-r--r-- | doc/src/webkit/guide/chapter_cache.qdoc | 338 | ||||
-rw-r--r-- | doc/src/webkit/guide/chapter_canvas.qdoc | 907 | ||||
-rw-r--r-- | doc/src/webkit/guide/chapter_css.qdoc | 6 | ||||
-rw-r--r-- | doc/src/webkit/guide/guidelinks.qdoc | 28 | ||||
-rw-r--r-- | doc/src/webkit/webkit.qdoc | 4 | ||||
-rw-r--r-- | examples/webkit/webkit-guide/webkit-guide.pro | 258 |
7 files changed, 1007 insertions, 538 deletions
diff --git a/doc/src/declarative/qmlwebkit.qdoc b/doc/src/declarative/qmlwebkit.qdoc index ad2a50c..354e60a 100644 --- a/doc/src/declarative/qmlwebkit.qdoc +++ b/doc/src/declarative/qmlwebkit.qdoc @@ -42,9 +42,9 @@ The QtWebKit Module has a QML element, \l{WebView} for displaying web content from a \c URL. Import the QtWebKit module before declaring a \c WebView element: -\code +\qml import QtWebKit 1.0 -\endcode +\endqml \section1 Simple Usage \snippet doc/src/snippets/declarative/webview/webview.qml document diff --git a/doc/src/webkit/guide/chapter_cache.qdoc b/doc/src/webkit/guide/chapter_cache.qdoc index 4e51c33..b26827e 100644 --- a/doc/src/webkit/guide/chapter_cache.qdoc +++ b/doc/src/webkit/guide/chapter_cache.qdoc @@ -41,48 +41,61 @@ /*! \page qtwebkit-guide-cache.html -\title QtWebKit Guide - Client Storage +\title Client Storage (BETA) \chapter Client Storage -Traditional mobile web development centered around the limitations of client -handsets, which had very little storage for applications. As handsets become -more powerful, however, this assumption is no longer valid. HTML5's newly -introduced \l{HTML5 Web Storage}{Web Storage} features expand application -storage on the client. - -HTML 5 standardizes access to an application's local data via \c{LocalStorage} -and \c{SessionStorage} APIs. These APIs boost the amount of client storage -available to web applications. They also can effectively replace cookies as a -means to maintain application state and track user preferences. - -Local storage persists indefinitely, while session storage lasts only for the -duration of a window session. Local storage is available from any page or window -from the same site, while session storage is local to each window. Both local -and session storage rely on simple key/value pairs, with keys and values both -stored as strings. - -Local and session storage are not the only client storage available. HTML 5 -WebSQL serves as a more full-featured, client-side database. WebSQL brings -SQLite-based structured database functionality, typically deployed on servers, -to client browser applications. WebSQL is appropriate for data-intensive -applications requiring complex queries rather than simple key/value access. -WebSQL database transaction calls help avoid interfaces from locking up, -facilitate rollback and error handling, and protect against SQL injection. +Traditional mobile web development centered around the limitations of +client handsets, +which had very little storage for applications. +As handsets become more powerful, +however, +this assumption is no longer valid. +HTML5\'s newly introduced Storage features expand application storage +on the client. + +HTML 5 standardizes access to an application\'s local data via +\c{LocalStorage} and \c{SessionStorage} APIs. +These APIs boost the amount of client storage available to web +applications. +They also can effectively replace cookies as a means to maintain +application state and track user preferences. + +Local storage persists indefinitely, +while session storage lasts only for the duration of a window session. +Local storage is available from any page or window from the same site, +while session storage is local to each window. +Both local and session storage rely on simple key/value pairs, +with keys and values both stored as strings. + +Local and session storage are not the only client storage available. +HTML 5 WebSQL serves as a more full-featured, +client-side database. +WebSQL brings SQLite-based structured database functionality, +typically deployed on servers, +to client browser applications. +WebSQL is appropriate for data-intensive applications requiring +complex queries rather than simple key/value access. +WebSQL database transaction calls help avoid interfaces from locking +up, +facilitate rollback and error handling, +and protect against SQL injection. Database versioning allows you to manage schema changes incrementally. \section1 Simple Data Storage -The \c{localStorage} and \c{sessionStorage} APIs offer applications up to 5MB of -data storage. They both share the same simple key/value interface, but have -different namespaces and also differ in the extent to which data is available. -Local storage persists indefinitely, while session storage only lasts for the -duration of a window session. Local storage is available from any page or window -from the same site, while session storage is local to each window. +The \c{localStorage} and \c{sessionStorage} APIs offer applications +up to 5MB of data storage. They both share the same simple key/value +interface, but have different namespaces and also differ in the extent +to which data is available. Local storage persists indefinitely, while +session storage only lasts for the duration of a window session. Local +storage is available from any page or window from the same site, while +session storage is local to each window. -The following examples demonstrate the API interface. While these use +The following examples demonstrate the API interface. While these use \c{localStorage} as an example, the same set of API calls work for -\c{sessionStorage}, which is also available within the \c{window} object. +\c{sessionStorage}, which is also available within the \c{window} +object. The following performs an initial check for support of browser-based storage and assigns the database to a variable: @@ -98,20 +111,23 @@ else { \endcode The \c{getItem()} method retrieves the value of a database field named -\c{key}: +\bold{key}: \code var value = db.getItem("key"); \endcode -Note that both keys and values are represented as strings. If you specify any -other type of data, it is converted silently to a string representation. (See -\l{Storing Non-String Data} for ways around this limitation.) If \c{getItem()} -returns \c{null} rather than a string value, it means the specified key does not -exist. +Note that both keys and values are represented as strings. +If you specify any other type of data, +it is converted silently to a string representation. +(See \l{Storing Non-String Data} for ways around this limitation.) +If \c{getItem()} returns \c{null} rather than a string value, +it means the specified key does not exist. -The \c{setItem()} method establishes a new value. When adding data, it is a good -idea to check to make sure you haven't exceeded the allotted storage space: +The \c{setItem()} method establishes a new value. +When adding data, +it is a good idea to check to make sure you haven\'t exceeded the +allotted storage space: \code try { @@ -130,19 +146,20 @@ The \c{removeItem()} method deletes database fields: db.removeItem("key"); \endcode -The \c{clear()} method deletes all key/value pairs within the database, either -for an entire site in the case of \c{localStorage}, or for an individual window -session in the case of \c{sessionStorage}: +The \c{clear()} method deletes all key/value pairs within the +database, either for an entire site in the case of \c{localStorage}, +or for an individual window session in the case of \c{sessionStorage}: \code db.clear(); \endcode -Databases can be accessed as arrays using index notation, useful in cases where -you may not know all the field names. The \c{length} property returns the number -of fields in the database, and the \c{key()} method returns the name of the key -corresponding to a given index. The following reflects the contents of a -database in a JavaScript object: +Databases can be accessed as arrays using index notation, useful in +cases where you may not know all the field names. The \c{length} +property returns the number of fields in the database, and the +\c{key()} method returns the name of the key corresponding to a given +index. The following reflects the contents of a database in a +JavaScript object: \code var obj = {}; @@ -151,14 +168,16 @@ for ( var i = 0, l = db.length ; i < l ; i++ ) { } \endcode -Since keys correspond to array indexes, you should not add or remove keys during -any operation that iterates over the full set of key/value pairs. Newly -introduced keys are introduced randomly into the array's sequence. +Since keys correspond to array indexes, you should not add or remove +keys during any operation that iterates over the full set of key/value +pairs. Newly introduced keys are introduced randomly into the array\'s +sequence. -The following displays simple storage functionality. The application prompts for -a login and password if they are unavailable. This locally stored data is -available the next time users open the browser. However, the contents of the -credit card field is stored only for the duration of the browing session. +The following displays simple storage functionality. The application +prompts for a login and password if they are unavailable. This locally +stored data is available the next time users open the browser. +However, the contents of the credit card field is stored only for the +duration of the browing session. \l{ex_storage}{\inlineimage webkit-guide/scr_storage.png } @@ -169,10 +188,10 @@ credit card field is stored only for the duration of the browing session. \section2 Storing Non-String Data - Since local and session storage APIs only support string values, you need to - be careful not to allow errors that result from passive conversions from - other data types. The following sample shows how such an error might come - about: + Since local and session storage APIs only support string values, you + need to be careful not to allow errors that result from passive + conversions from other data types. The following sample shows how + such an error might come about: \code var db = window.localStorage; @@ -192,15 +211,17 @@ credit card field is stored only for the duration of the browing session. } \endcode - The user's preference to retain credit card information is expressed within - the application as a \c{true} or \c{false} boolean value. When each value is - passed to storage, however, it is passively converted to a string. When - reassigned to a JavaScript variable, it no longer serves as a valid boolean - test. The application falsely assumes users want to save credit card - information, regardless of their expressed preference. + The user\'s preference to retain credit card information is expressed + within the application as a \c{true} or \c{false} boolean value. When + each value is passed to storage, however, it is passively converted to + a string. When reassigned to a JavaScript variable, it no longer + serves as a valid boolean test. The application falsely assumes users + want to save credit card information, regardless of their expressed + preference. The following sample fixes the problem. Instead of using \c{true} and - \c{false} boolean values, it converts \c{1} and \c{0} strings to numbers: + \c{false} boolean values, it converts \c{1} and \c{0} strings to + numbers: \code var db = window.localStorage; @@ -210,9 +231,10 @@ credit card field is stored only for the duration of the browing session. saveCardInfo = db.getItem("save_card_info") * 1; \endcode - For a more reliable alternative, store values as JSON strings and rely on - automatic type conversion when subsequently parsing them. The following - sample shows how parsing JSON preserves both boolean and numeric data: + For a more reliable alternative, store values as JSON strings and rely + on automatic type conversion when subsequently parsing them. The + following sample shows how parsing JSON preserves both boolean and + numeric data: \code var saveCardInfo = true; // boolean @@ -226,9 +248,10 @@ credit card field is stored only for the duration of the browing session. shipMethod = JSON.parse(db.getItem("ship_method")); // number \endcode - Note that this simple approach may cause problems of its own. For example, - perhaps the words \c{true} and \c{false} really should be represented - as strings. Encapsulating data within objects accounts for such variability: + Note that this simple approach may cause problems of its own. For + example, perhaps the words \bold{true} and \bold{false} really should + be represented as strings. Encapsulating data within objects accounts + for such variability: \code var db = window.localStorage; @@ -244,9 +267,9 @@ credit card field is stored only for the duration of the browing session. \endcode The ability to save objects as JSON strings means that you can save an - application's state within a single database field. For example, you might - use the following approach to save the entire contents of a shopping cart in - a single field for later use: + application\'s state within a single database field. For example, you + might use the following approach to save the entire contents of a + shopping cart in a single field for later use: \code var db = window.localStorage; @@ -277,17 +300,17 @@ credit card field is stored only for the duration of the browing session. cart = JSON.parse(db.getItem("cart")); \endcode - JSON allows you to store data types, but functions are ignored. That makes - it more difficult to preserve objects representing fully functional - applications. + JSON allows you to store data types, but functions are ignored. That + makes it more difficult to preserve objects representing fully + functional applications. \section2 Storage Events - The \c{storage} event allows applications to respond indirectly to modified - data resulting from calls to \c{setItem()}, \c{removeItem()}, or - \c{clear()}. This may be useful in providing users with visual feedback - notifying them of data that is modified locally, perhaps rather than being - sent to a remote server: + The \c{storage} event allows applications to respond indirectly to + modified data resulting from calls to \c{setItem()}, \c{removeItem()}, + or \c{clear()}. This may be useful in providing users with visual + feedback notifying them of data that is modified locally, perhaps + rather than being sent to a remote server: \code window.addEventListener("storage", function(event){ @@ -301,21 +324,22 @@ credit card field is stored only for the duration of the browing session. }, false); \endcode - The \c{storage} event's \c{storageArea} attribute returns the - \c{localStorage} or \c{sessionStorage} object being modified. The \c{key} is - the name of the field being modified, and \c{oldValue} and \c{newValue} are - its values before and after the event. The \c{url} is the page that called - the method triggering the change. + The \c{storage} event\'s \c{storageArea} attribute returns the + \c{localStorage} or \c{sessionStorage} object being modified. The + \c{key} is the name of the field being modified, and \c{oldValue} and + \c{newValue} are its values before and after the event. The \c{url} is + the page that called the method triggering the change. \section1 WebSQL Databases -While common local- or session-based databases are capable of storing complex -data structures, QtWebKit-based browsers can also rely upon the WebSQL standard, -which brings SQLite-based structured database functionality, typically deployed -on servers, to client browser applications. Based on SQLite version 3.6.19, -WebSQL is appropriate for data-intensive applications requring complex queries -rather than simple key/value access. +While common local- or session-based databases are capable of storing +complex data structures, QtWebKit-based browsers can also rely upon +the WebSQL standard, which brings SQLite-based structured database +functionality, typically deployed on servers, to client browser +applications. Based on SQLite version 3.6.19, WebSQL is appropriate +for data-intensive applications requring complex queries rather than +simple key/value access. The following test confirms support for WebSQL: @@ -332,9 +356,13 @@ interaction may occur from several windows at a time. The three core API methods are: \list + \o \c{openDatabase()} + \o \c{transaction()} + \o \c{executeSql()} + \endlist \section2 Creating and Opening a New Database @@ -347,32 +375,34 @@ The three core API methods are: var db = openDatabase('notes', '', 'The Example Notes App!', 1048576); \endcode - The four required arguments are the database name, version, display name, - and estimated size in bytes. You can supply a function as an optional fifth - argument to serve as a callback when a database is created. It may be used - to call the \c{changeversion()} method, in which case the callback is - invoked with an empty string for the database version. + The four required arguments are the database name, version, display + name, and estimated size in bytes. You can supply a function as an + optional fifth argument to serve as a callback when a database is + created. It may be used to call the \c{changeversion()} method, in + which case the callback is invoked with an empty string for the + database version. - The second example above specifies an empty string for the version. In this - case, the database opens no matter what the database version is. (An - \c{openDatabase()} call specifying the wrong version for an existing - database throws an \c{INVALID_STATE_ERR} exception.) You can then query the - version by examining the database object's version property, for example: + The second example above specifies an empty string for the version. In + this case the database opens no matter what the database version + is. (An \c{openDatabase()} call specifying the wrong version for an + existing database throws an \c{INVALID_STATE_ERR} exception.) You can + then query the version by examining the database object's version + property, for example: \code var version = db.version; \endcode - Note that you don't need to close a client-side Web SQL database when - you're done working with it. + Note that you don\'t need to close a client-side Web SQL database when + you\'re done working with it. \section2 Transaction Calls and ExecuteSQL Method Performing database transactions is superior to running SQL statements - directly because transactions are not committed if they fail and you can - undo them if needed. Transactions also allow you to handle errors using a - callback. To implement a transaction, specify a callback function such as - the following: + directly because transactions are not committed if they fail and you + can undo them if needed. Transactions also allow you to handle errors + using a callback. To implement a transaction, specify a callback + function such as the following: \code db.transaction(function (tx) { @@ -383,25 +413,35 @@ The three core API methods are: The \c{transaction()} method takes one to three arguments: \list + \o a required transaction callback, in which \c{executeSQL()} calls belong + \o an optional transaction error object + \o an optional success callback. + \endlist - Use the \c{executeSQL()} method to specify SQL statements for read and write - operations. The method protects against SQL injection and provides a - callback method to process the results of any SQL queries you specify. The - \c{executeSQL()} method takes from one to four arguments: + Use the \c{executeSQL()} method to specify SQL statements for read and + write operations. The method protects against SQL injection and + provides a callback method to process the results of any SQL queries + you specify. The \c{executeSQL()} method takes from one to four + arguments: \list + \o a required SQL statement + \o an optional object array of arguments + \o an optional SQL statement callback + \o an optional SQL statement error callback + \endlist - The example below creates the database if it doesn't exist, adds a + The example below creates the database if it doesn\'t exist, adds a two-column table to the database, and adds a row of data to the table: \code @@ -412,9 +452,10 @@ The three core API methods are: }); \endcode - To capture data from the user or an external source, use \c{?} placeholders - to map that data into the SQL query. This ensures the data doesn't - compromise database security, for example from SQL injection: + To capture data from the user or an external source, use \c{?} + placeholders to map that data into the SQL query. This ensures the + data doesn\'t compromise database security, for example from SQL + injection: \code tx.executeSql('INSERT INTO foo (id, text) VALUES (?, ?)', [id, value]); @@ -423,7 +464,8 @@ The three core API methods are: \c{id} and \c{value} are external variables, and \c{executeSql} maps the items in the array to the \c{?}s. - To select values from the table, use a callback to capture the results: + To select values from the table, use a callback to capture the + results: \code tx.executeSql('SELECT * FROM foo', [], function(tx, results) { @@ -433,27 +475,28 @@ The three core API methods are: }); \endcode - No fields are mapped in the above query, but to use the third argument you - need to pass in an empty array as the second argument. + No fields are mapped in the above query, but to use the third argument + you need to pass in an empty array as the second argument. The SQL statement callback for \c{executeSQL()} is called with the - \c{transaction} object and a SQL statement \c{result} object. The \c{result} - gives access to the ID of the last inserted row, the number of rows - affected, and an indexed list representing the rows returned, in the order - returned. + \c{transaction} object and a SQL statement \c{result} object. The + \c{result} gives access to the ID of the last inserted row, the number + of rows affected, and an indexed list representing the rows returned, + in the order returned. The \c{result} object contains an array-like \c{rows} object. It has a length, but to access individual rows you need to use - \c{results.rows.item(i)}, where \c{i} is the index of the row. This returns - an object representation of each row. For example, if your database has a - \c{name} and an \c{age} field, the \c{row} contains a \c{name} and an - \c{age} property. The value of the \c{age} field can be accessed using - \c{results.rows.item(i).age}. + \c{results.rows.item(i)}, where \c{i} is the index of the row. This + returns an object representation of each row. For example, if your + database has a \c{name} and an \c{age} field, the \c{row} contains a + \c{name} and an \c{age} property. The value of the \c{age} field can + be accessed using \c{results.rows.item(i).age}. \section2 Changing Database Versions - Each database has one version at a time and multiple versions cannot exist - at one time. Versions allow you to manage schema changes incrementally. + Each database has one version at a time and multiple versions cannot + exist at one time. Versions allow you to manage schema changes + incrementally. You can change the version of a client-side Web SQL database using the \c{changeversion()} method: @@ -470,39 +513,44 @@ The three core API methods are: } \endcode - \c{changeversion()} takes the following arguments: required old and new - version numbers, optional SQL transaction callback, optional SQL transaction - error callback, and optional success callback. + \c{changeversion()} takes the following arguments: required old and + new version numbers, optional SQL transaction callback, optional SQL + transaction error callback, and optional success callback. \section2 Errors Asynchronous API errors are reported using callbacks that have a - \c{SQLError} object as one of their arguments. \c{SQLError} contains a code - from the table below and a localized message string. + \c{SQLError} object as one of their arguments. \c{SQLError} contains a + code from the table below and a localized message string. Error codes are: \list + \o 0 \c{UNKNOWN_ERROR} Transaction failed for reasons unrelated to the DB + \o 1 \c{DATABASE_ERROR} Statement failed for DB reasons not covered by other code - \o 2 \c{VERSION_ERROR} DB version doesn't match expected version + + \o 2 \c{VERSION_ERROR} DB version doesn\'t match expected version + \o 3 \c{TOO_LARGE_ERROR} Data returned from DB was too large. Try the \c{SQL LIMIT} modifier. + \o 4 \c{QUOTA_ERROR} Insufficient remaining storage + \o 5 \c{SYNTAX_ERROR} Syntax error, argument mismatch, or unallowed statement + \o 6 \c{CONSTRAINT_ERROR} An \c{INSERT}, \c{UPDATE}, or \c{REPLACE} statement failed due to a constraint error + \o 7 \c{TIMEOUT_ERROR} Timeout waiting for transaction lock + \endlist \bold{See Also:} - \l{HTML5 Doctor: Introducing Web SQL Databases} - -\list -\o \l{QtWebKit Guide} -back to the main page -\endlist -*/ + \l{http://html5doctor.com/introducing-web-sql-databases/}{HTML5 + Doctor: Introducing Web SQL Databases} */ diff --git a/doc/src/webkit/guide/chapter_canvas.qdoc b/doc/src/webkit/guide/chapter_canvas.qdoc index 996d1ad..f04809a 100644 --- a/doc/src/webkit/guide/chapter_canvas.qdoc +++ b/doc/src/webkit/guide/chapter_canvas.qdoc @@ -40,53 +40,55 @@ /*! \page qtwebkit-guide-canvas.html -\title QtWebKit Guide - Canvas Graphics +\title Canvas Graphics (BETA) \chapter Canvas Graphics -The \l{HTML5 Canvas API} enables you to draw within a Web page or Web App using -JavaScript. After you define a rectangle that serves as your drawing canvas, you -can draw straight and curved lines, simple and complex shapes, graphs, and -referenced graphic images. You can add text, color, shadows, gradients, and -patterns. The canvas API also enables you to save or export the canvas as a .png -or .jpeg image file. +HTML5\'s Canvas API enables you to draw within a Web page or Web App +using JavaScript. After you define a rectangle that serves as your +drawing canvas, you can draw straight and curved lines, simple +and complex shapes, graphs, and referenced graphic images. You can add +text, color, shadows, gradients, and patterns. The canvas API also enables +you to save or export the canvas as a .png or .jpeg image file. -To define the drawing area, set the \c{width} and \c{height} of a \c{<canvas>} -element. For example, the following sets a drawing area with a height of 100 -pixels and width of 200 pixels: +To define the drawing area, set the \c{width} and \c{height} of a +\c{<canvas>} element. For example, the following sets a drawing area +with a height of 100 pixels and width of 200 pixels: \code <canvas id="mycanvas" width="100" height="200"></canvas> \endcode -By default, \c{canvas} elements are sized 150 pixels high and 300 pixels wide. -You can also set the size of the canvas using CSS: +By default, \c{canvas} elements are sized 150 pixels high and 300 +pixels wide. You can also set the size of the canvas using CSS: \code canvas { height : 200px; width : 100px; } \endcode -The \c{canvas} element is transparent and has no visible borders until you -\l{Accessing the Rendering Context}{access the 2D rendering context}. +The \c{canvas} element is transparent and has no visible borders until +you \l{Accessing the Rendering Context}{access the 2D rendering +context}. -Resetting the width or height of an existing canvas erases its contents and -resets all the context properties of the canvas to their default values. +Resetting the width or height of an existing canvas erases its +contents and resets all the context properties of the canvas to their +default values. \section1 Accessing the Rendering Context -The rendering \bold{context} defines the methods and attributes needed to draw -on the canvas. QtWebKit currently supports the two-dimensional rendering -context. The following assigns the canvas rendering context to a \c{context} -variable: +The rendering \bold{context} defines the methods and attributes needed +to draw on the canvas. QtWebKit currently supports the two-dimensional +rendering context. The following assigns the canvas rendering context +to a \c{context} variable: \code var context = canvas.getContext("2d") \endcode -The 2d context renders the canvas as a coordinate system whose origin (0,0) is -at the top left corner, as shown in the figure below. Coordinates increase along -the \c{x} axis from left to right and along the \c{y} axis from top to bottom of -the canvas. +The 2d context renders the canvas as a coordinate system whose origin +(0,0) is at the top left corner, as shown in the figure below. +Coordinates increase along the \c{x} axis from left to right and along +the \c{y} axis from top to bottom of the canvas. \image webkit-guide/canvas_context.gif @@ -94,7 +96,6 @@ the canvas. The 2D rendering context supports rectangles, lines, and arcs, which you can combine to build complex shapes and graphic images. - \section2 Drawing Rectangles The rectangle is the only geometric shape that is built in to the @@ -112,12 +113,17 @@ you can combine to build complex shapes and graphic images. Each method accepts the following series of arguments: \list + \o \c{x} is the position on the canvas to the right of the origin (0,0) of the top left corner of the rectangle + \o \c{y} is the position on the canvas below the origin of the top left corner of the rectangle + \o \c{width} is the width of the rectangle to be drawn + \o \c{height} is the height of the rectangle to be drawn + \endlist For example, the following code draws concentric rectangles: @@ -133,7 +139,7 @@ you can combine to build complex shapes and graphic images. \section2 Drawing Lines - To draw a line, you first have to \e{"put your pencil down"} on the canvas + To draw a line, you first have to "put your pencil down" on the canvas by creating a path. The \c{context.beginPath()} method sets a new path in the canvas. Each line that you draw is stored as a sub-path. Sub-paths can be closed to form a shape, or they can be left open. @@ -143,12 +149,12 @@ you can combine to build complex shapes and graphic images. After calling \c{beginPath()}, you set your starting position on the canvas by calling the \c{context.moveTo(x,y)} method. The \c{moveTo(x,y)} method creates a new subpath on the canvas that begins - at the Cartesian point \c{(x,y)}. + at the point (x,y). To draw a straight line, call the \c{context.lineTo(x,y)} method. This adds the point (x,y) to the current subpath and connects it to the previous subpath by a straight line. In other words, (x,y) are the - coordinates of the line's endpoint. For example: + coordinates of the line\'s endpoint. For example: \code context.beginPath(); @@ -156,24 +162,24 @@ you can combine to build complex shapes and graphic images. context.lineTo(30,30); \endcode - To get the \e{pencil} to actually draw on the canvas, first use the + To get the "pencil" to actually draw on the canvas, first use the \c{strokeStyle} property to set the color to a value such as black - (\c{#000}): + (#000): \code context.strokeStyle(#000); \endcode - (The \c{strokeStyle} property can be a CSS color, a pattern, or a gradient.) - Then use the \c{context.stroke()} method to actually draw the line on the - canvas: + (The \c{strokeStyle} property can be a CSS color, a pattern, or a + gradient.) Then use the \c{context.stroke()} method to actually draw + the line on the canvas: \code context.stroke(); \endcode - This produces the image below. The numeric coordinates are added for clarity - but are not part of the image drawn by the code: + This produces the image below. The numeric coordinates are added for + clarity but are not part of the image drawn by the code: \image webkit-guide/canvas_lineStrokeTo.gif @@ -199,43 +205,59 @@ you can combine to build complex shapes and graphic images. context.fill(); // fill the triangle \endcode - The commands, if coded fully, would create the shape below: + The above commands, if coded fully, would create the shape below: \image webkit-guide/canvas_closepath.gif - \note It is not necessary to close the path when calling the \c{fill()} - method. Calling \c{fill()} closes the path and creates the completed shape. + \bold{NOTE:} It is not necessary to close the path when calling the + \c{fill()} method. Calling \c{fill()} closes the path and creates the + completed shape. - You can draw lines of various widths, endcap types, and joining options by - configuring the following attributes: + You can draw lines of various widths, endcap types, and joining + options by configuring the following attributes: \list - \o \c{lineWidth} sets the thickness of the current line. The value can be - any number greater than \c 0. For example, \c{context.lineWidth = 10} sets - the line thickness to \c 10 units. The default value is \c 1 unit, which is - not the same as \c 1 \e pixel. Instead, the line is centered on the current - path, with half its thickness on each side of the path. - \o \c{lineCap} sets the type of endpoint of the current line. The value can - be either \c{butt}, \c{square}, or \c{round}. (The default value is - \c{butt}.) + + \o \c{lineWidth} sets the thickness of the current line. The value can + be any number greater than 0. For example, \c{context.lineWidth = 10} + sets the line thickness to 10 units. The default value is 1 unit, + which is not the same as 1 pixel. Instead, the line is centered on the + current path, with half its thickness on each side of the path. + + \o \c{lineCap} sets the type of endpoint of the current line. The + value can be either \c{butt}, \c{square}, or \c{round}. (The + default value is \c{butt}.) + \list + \o \c{butt}- the ends of the line abutt the line guide. + \o \c{square} adds a box at both ends of the line. + \o \c{round} adds a semicircle at both ends of the line. + \endlist \o \c{lineJoin} sets the style with which lines are joined. The value can be either \c{bevel}, \c{round}, or \c{miter}. (The default value is \c{miter}.) - \list - \o \c{bevel} flattens the corners at which the lines join - \o \c{round} rounds the corners at which the lines join - \o \c{miter} joins the lines at a single point - \endlist - \o \c{miterLimit} sets the \e{miter limit ratio}. The value can be any - number greater than \c 0. The miter limit ratio determines how far the - connection point of the outside of the lines can be from the connection - point of the inside of the lines. (The default value is \c 10.) + + \list + + \o \c{bevel} flattens the corners at which the lines join + + \o \c{round} rounds the corners at which the lines join + + \o \c{miter} joins the lines at a single point + + \endlist + + \o \c{miterLimit} sets the miter limit ratio. The value can be any + number greater than 0. The miter limit ratio determines how far the + connection point of the outside of the lines can be from the + connection point of the inside of the lines. (The default value is + 10.) + \endlist \image webkit-guide/canvas_linecap.png @@ -246,30 +268,35 @@ you can combine to build complex shapes and graphic images. a line: \list 1 - \o Call the \c{context.beginPath()} method to \e{"put your pencil down"} on - the canvas and set a new path. - \o Call the \c{context.moveTo(x,y)} method to set your starting position on - the canvas at the point (x,y). - \o To draw an arc or circle, call the \c{context.arcTo(x1,y1,x2,y2,radius)} - method. This adds an arc with starting point \c{(x1,y1)}, ending point - \c{(x2,y2)}, and radius \c{radius} to the current subpath and connects it to - the previous subpath by a straight line. + + \o Call the \c{context.beginPath()} method to "put your pencil down" on the + canvas and set a new path. + + \o Call the \c{context.moveTo(x,y)} method to set your starting + position on the canvas at the point (x,y). + + \o To draw an arc or circle, call the + \c{context.arcTo(x1,y1,x2,y2,radius)} method. This adds an arc with + starting point \c{(x1,y1)}, ending point \c{(x2,y2)}, and radius \c{radius} to the + current subpath and connects it to the previous subpath by a straight + line. \image webkit-guide/canvas_arcTo.png \o An alternative way to draw an arc or circle is to call the - \c{context.arc(x,y,radius,startAngle,endAngle,anticlockwise)} method. This - adds an arc to the current subpath that lies on the circumference of the - circle whose center is at the point (x,y) and whose radius is \c{radius}. + \c{context.arc(x,y,radius,startAngle,endAngle,anticlockwise)} + method. This adds an arc to the current subpath that lies on the + circumference of the circle whose center is at the point (x,y) and + whose radius is \c{radius}. \image webkit-guide/canvas_arcTo2.png - Both \c{startAngle} and \c{endAngle} are measured from the x axis in units - of radians. + Both \c{startAngle} and \c{endAngle} are measured from the x axis in + units of radians. - A complete circle is \c 360 degrees, or 2\pi radians. A semicircle is \c 180 - degrees, or \pi radians. The number of radians is the number of degrees - multiplied by \pi/180, expressed in JavaScript as: + A complete circle is 360 degrees, or 2\pi radians. A semicircle is 180 + degrees, or \pi radians. The number of radians is the number of + degrees multiplied by \pi/180, expressed in JavaScript as: \code var radians = (Math.PI/180)*degrees; @@ -300,33 +327,42 @@ you can combine to build complex shapes and graphic images. \endlist - \note It is not necessary to close the path if you are going to call + \bold{NOTE:} It is not necessary to close the path if you are going to call the \c{fill()} method. The fill closes the path and creates the completed shape. To create complex shapes, combine lines and arcs: \list 1 - \o Call the \c{context.beginPath()} method to \e{"put your pencil down"} on - the canvas and set a new path. - \o Call the \c{context.moveTo(x,y)} method to set your starting position on - the canvas at the point (x,y). + + \o Call the \c{context.beginPath()} method to "put your pencil down" + on the canvas and set a new path. + + \o Call the \c{context.moveTo(x,y)} method to set your starting + position on the canvas at the point (x,y). + \o Draw any combination of lines and arcs by calling the \c{lineTo}, - \c{arcTo}, \c{arc}, \c{moveTo}, \c{closePath}, \c{stroke}, and \c{fill} - methods and setting the line attributes and fill colors as described above. + \c{arcTo}, \c{arc}, \c{moveTo}, \c{closePath}, \c{stroke}, and + \c{fill} methods and setting the line attributes and fill colors as + described above. + \endlist - You can also create complex shapes by removing portions of the shapes you - draw. The \c{clip()} method creates a clipping path that defines the area - along which your "scissor" will cut. Any parts of the shape outside the - clipping path are not displayed. To create a complex shape using the - \c{clip()} method: + You can also create complex shapes by removing portions of the shapes + you draw. The \c{clip()} method creates a clipping path that defines + the area along which your "scissor" will cut. Any parts of the shape + outside the clipping path are not displayed. To create a complex shape + using the \c{clip()} method: \list 1 + \o Call the \c{context.beginPath()} method to set the clipping path. - \o Define the clipping path by calling any combination of the \c{lineTo}, - \c{arcTo}, \c{arc}, \c{moveTo}, and \c{closePath} methods. + + \o Define the clipping path by calling any combination of the + \c{lineTo}, \c{arcTo}, \c{arc}, \c{moveTo}, and \c{closePath} methods. + \o Call the \c{context.clip()} method. + \endlist The new shape displays. The following shows how a clipping path can @@ -336,165 +372,217 @@ you can combine to build complex shapes and graphic images. \section1 Compositing -You can build complex shapes by drawing shapes on top of each other. It is also -possible to draw shapes behind existing shapes and to mask parts of shapes by -using \e{compositing operations}. The \c{globalCompositeOperation} attribute -sets the way shapes can be combined. +You can build complex shapes by drawing shapes on top of each +other. It is also possible to draw shapes behind existing shapes and +to mask parts of shapes by using compositing operations. The +\c{globalCompositeOperation} attribute sets the way shapes can be +combined. -The first shape drawn on the canvas to which additional shapes are added is -called the \e{destination} shape. The shape drawn on the canvas afterwards to -create the composite image is called the \e{source} shape. The value of the -\c{globalCompositeOperation} attribute must be set to one of the following: +The first shape drawn on the canvas to which additional shapes are +added is called the destination shape. The shape drawn on the canvas +afterwards to create the composite image is called the source shape. +The value of the \c{globalCompositeOperation} attribute must be set to +one of the following: \list -\o \c{source-over} displays the source (newer) shape over the destination -(older) shape unless the source shape is transparent. (This is the default -value) -\o \c{source-in} displays only the portion of the source shape that is opaque -and overlaps the destination shape. Everything else is transparent. +\o \c{source-over} displays the source (newer) shape over the +destination (older) shape unless the source shape is transparent. +(This is the default value) + +\o \c{source-in} displays only the portion of the source shape that is +opaque and overlaps the destination shape. Everything else is +transparent. -\o \c{source-out} displays only the portion of the source shape that does not -overlap the destination shape. +\o \c{source-out} displays only the portion of the source shape that +does not overlap the destination shape. -\o \c{source-atop} displays only the portion of the opaque source shape that -overlaps the destination shape and the portion of the destination shape that is -not covered by the opaque source shape. +\o \c{source-atop} displays only the portion of the opaque source +shape that overlaps the destination shape and the portion of the +destination shape that is not covered by the opaque source shape. -\o \c{destination-over} displays the destination shape over the source shape. In -areas where both shapes are opaque and overlap, the older shape displays. +\o \c{destination-over} displays the destination shape over the source +shape. In areas where both shapes are opaque and overlap, the older +shape displays. -\o \c{destination-in} displays only the portion of the destination shape that is -opaque and overlaps the source shape. Everything else is transparent. The source -(newer) shape is not visible. +\o \c{destination-in} displays only the portion of the destination +shape that is opaque and overlaps the source shape. Everything else is +transparent. The source (newer) shape is not visible. -\o \c{destination-out} displays only the portion of the destination shape that -does not overlap the source shape. The source shape is not visible. +\o \c{destination-out} displays only the portion of the destination +shape that does not overlap the source shape. The source shape is not +visible. -\o \c{destination-atop} displays only the portion of the opaque destination -shape that overlaps the source shape and the portion of the source shape that is -not covered by the opaque destination shape. +\o \c{destination-atop} displays only the portion of the opaque +destination shape that overlaps the source shape and the portion of +the source shape that is not covered by the opaque destination shape. -\o \c{lighter} displays both the source and destination shapes. Where the shapes -overlap, the their color values are added, producing a lighter color. +\o \c{lighter} displays both the source and destination shapes. Where +the shapes overlap, the their color values are added, producing a +lighter color. -\o \c{copy} displays only the source shape. The destination shape is ignored. +\o \c{copy} displays only the source shape. The destination shape is +ignored. + +\o \c{xor} displays both the source and the destination shapes except +the areas of overlap, in which both shapes are completely transparent. -\o \c{xor} displays both the source and the destination shapes except the areas -of overlap, in which both shapes are completely transparent. \endlist The following figure shows the various compositing effects: + \image webkit-guide/canvas_composite.png \section1 Saving and Exporting Canvas Drawings as Image Files -You can save or export your canvas drawings as .png or .jpeg image files by -calling the \c{toDataURL()} method: +You can save or export your canvas drawings as .png or .jpeg image +files by calling the \c{toDataURL()} method: \code canvas.toDataURL([type, ...]) \endcode + where: + \list -\o \c{type} is the MIME type to which you want to save or export your canvas. -Possible values are: - \list - \o \c{"image\png"} (Default value) - \o \c{"image\jpeg"} - \endlist + +\o \c{type} is the MIME type to which you want to save or export your +canvas. Possible values are: + +\list + +\o \c{"image\png"} (Default value) +\o \c{"image\jpeg"} + +\endlist + \o\c{...} represents additional arguments that depend on the MIME type. - \list - \o If \c{type} is \c{png}, this argument is \c{" "} - \o If \c{type} is \c{jpeg}, this argument is the desired quality level of the - image. The value is a number in the range 0.0 to 1.0, inclusive. - \endlist + +\list + +\o If \c{type} is \c{png}, this argument is \c{" "} +\o If \c{type} is \c{jpeg}, this argument is the desired quality level of the image. The value is a number in the range 0.0 to 1.0, inclusive. + +\endlist \endlist \section1 Drawing Text -You can draw text on your canvas by setting the following font attributes on the -2d drawing context: +You can draw text on your canvas by setting the following font +attributes on the 2d drawing context: \list -\o \c{font} refers to any font, expressed the same way as in CSS properties. -This attribute's value can include any font style, variant, weight, size, -height, and family. For example: - \code - context.font = "12pt Arial"; - \endcode +\o \c{font} refers to any font, expressed the same way as in CSS +properties. This attribute\'s value can include any font style, +variant, weight, size, height, and family. For example: - The default value is \c{10px sans-serif}. +\code +context.font = "12pt Arial"; +\endcode - If you set the \c{font} attribute to a - relative font size, the browser multiplies it by the computed font size of the - \c{<canvas>} element itself. For example: +The default value is \c{10px sans-serif}. - \code - context.font = "200%"; - \endcode +If you set the \c{font} attribute to a relative font size, the browser +multiplies it by the computed font size of the \c{<canvas>} element +itself. For example: -\o \c{textAlign} specifies the alignment of the text. The values can be one of -the following: - \list - \o \c{left} for left-aligned text - \o \c{right} for right-aligned text - \o \c{center} for text that is centered within each line - \o \c{start} (default) - the text is aligned at the beginning of the line. Text - is left- or right-justified based on locale-specific writing method: left when - text is left-to-right, right when text is right-to-left. - \o \c{end} - the text is aligned at the end of the line, either left or right - depending on locale-specific writing method. - \endlist +\code +context.font = "200%"; +\endcode + +\o \c{textAlign} specifies the alignment of the text. The values can +be one of the following: + +\list + +\o \c{left} for left-aligned text + +\o \c{right} for right-aligned text + +\o \c{center} for text that is centered within each line + +\o \c{start} (default) - the text is aligned at the beginning of the +line. Text is left- or right-justified based on locale-specific +writing method: left when text is left-to-right, right when text is +right-to-left. + +\o \c{end} - the text is aligned at the end of the line, either left or +right depending on locale-specific writing method. + +\endlist + +\o \c{textBaseline} specifies the position at which text is drawn +relative to a baseline. The figure below, from +\l{http://dev.w3.org/html5/canvas-api/canvas-2d-api.html}{the World +Wide Web Consortium}, illustrates the possible values for the +\c{textBaseline} attribute: + +\list + +\o \c{top} is the top of the em square, which approximates the top of the +glyphs in a font + +\o \c{hanging} specifies a hanging baseline, where the tops of some +glyphs are anchored. + +\o \c{middle} is the mid-point of the em square + +\o \c{alphabetic} (default) is the anchor point of many alphabetic +characters + +\o \c{ideographic} is the anchor point of many ideograms, such as the +characters used in the writing systems of many Asian languages + +\o \c{bottom} is the bottom of the em square + +\endlist -\o \c{textBaseline} specifies the position at which text is drawn relative to a -baseline. The figure below, from \l{HTML5 Canvas API}, illustrates the possible -values for the \c{textBaseline} attribute: - \list - \o \c{top} is the top of the em square, which approximates the top of the glyphs - in a font - \o \c{hanging} specifies a hanging baseline, where the tops of some glyphs are - anchored. - \o \c{middle} is the mid-point of the em square - \o \c{alphabetic} (default) is the anchor point of many alphabetic characters - \o \c{ideographic} is the anchor point of many ideograms, such as the characters - used in the writing systems of many Asian languages - \o \c{bottom} is the bottom of the em square - \endlist \endlist \image webkit-guide/canvas_text.png To draw text on a canvas: + \list 1 + \o Set the \c{font} attribute on the drawing context. For example: - \code - context.font = "bold 11px arial" - \endcode -\o Measure the text that you want to draw by calling the \c{measureText} method: - \code - TextMetrics measureText("Text to draw"); - \endcode -where \c{TextMetrics} is the object returned. Its \c{width} attribute is the -width, in pixels, that the \c{"Text to draw"} would be when drawn with the font -specified by the \c{font} attribute. + +\code +context.font = "bold 11px arial" +\endcode + +\o Measure the text that you want to draw by calling the \c{measureText} +method: + +\code +TextMetrics measureText("Text to draw"); +\endcode + +where \c{TextMetrics} is the object returned. Its \c{width} attribute +is the width, in pixels, that the "Text to draw" would be when drawn +with the font specified by the \c{font} attribute. + \o Call either of the following methods: - \list - \o \c{fillText} draws the text with the font style specified by the \c{font} - attribute, the alignment specified by the \c{textAlign} attribute, and the - baseline specified by the \c{textBaseline} attribute. For example: - \code - context.fillText("Text to draw",x,y,maximumWidth); - \endcode -where \c{x} and \c{y} are the coordinates at which the drawing begins (the -anchor point), and \c{maximumWidth} is the maximum width of the text string -(optional). If the \c{width} returned in step 2 is larger than the -\c{maximumWidth}, the font is scaled down until the width of the text string is -less than the \c{maximumWidth} specified. -If you don't specify the \c{font} attribute, the text inherits the font size and -style of the \c{<canvas>} element itself. +\list + +\o \c{fillText} draws the text with the font style specified by the +\c{font} attribute, the alignment specified by the \c{textAlign} attribute, +and the baseline specified by the \c{textBaseline} attribute. For example: + +\code +context.fillText("Text to draw",x,y,maximumWidth); +\endcode + +where \c{x} and \c{y} are the coordinates at which the drawing begins +(the anchor point), and \c{maximumWidth} is the maximum width of the +text string (optional). If the \c{width} returned in step 2 is larger +than the \c{maximumWidth}, the font is scaled down until the width of +the text string is less than the \c{maximumWidth} specified. + +If you don\'t specify the \c{font} attribute, the text inherits the +font size and style of the \c{<canvas>} element itself. \o \c{strokeText} is the same as the \c{fillText} method, except that a stroke style is applied to the text instead of a fill style, @@ -563,23 +651,30 @@ context.drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh) \endcode where: + \list -\o \c{sx} is the x coordinate of the upper left corner of the cropped source -image -\o \c{sy} is the y coordinate of the upper left corner of the cropped source -image + +\o \c{sx} is the x coordinate of the upper left corner of the cropped +source image + +\o \c{sy} is the y coordinate of the upper left corner of the cropped +source image + \o \c{sw} is the width of the cropped source image + \o \c{sh} is the height of the cropped source image + \endlist -Use this method if you want to crop the source image to the rectangle (sx, sy, -sw, sh) before drawing it on the canvas. The destination image will have width -\c dw, height \c dh, and upper left corner at coordinates \c{(dx,dy)} on the -canvas. +Use this method if you want to crop the source image to the rectangle +(sx, sy, sw, sh) before drawing it on the canvas. The destination +image will have width dw, height dh, and upper left corner at +coordinates (dx,dy) on the canvas. -To create a new image using JavaScript, create an \c{Image} object and define -its source. Use an \c{onload} event handler to ensure that the \c{drawImage} -method is not called until the image has finished loading. For example: +To create a new image using JavaScript, create an \c{Image} object and +define its source. Use an \c{onload} event handler to ensure that the +\c{drawImage} method is not called until the image has finished loading. +For example: \code var graphic = new Image(); @@ -613,25 +708,30 @@ graphic.onload = function(){ that is repeated to form a pattern. The image must be fully loaded before you can draw it on the canvas. The reference cannot be a URL. Instead, it should be referenced via standard DOM - methods such as - \list - \o \c{document.images} and - \o \c{document.getElementById}. For example: - - \code - <canvas id="demo1" width="100" height="150"></canvas> - - var canvas = document.getElementById("demo1"); - var context = canvas.getContext("2d"); - \endcode - \endlist - \o \c{repetition} is the direction in which the image repeats to form the - pattern. Possible values are: - \list - \o \c{repeat} (default) the image repeats both horizontally and vertically - \o \c{repeat-x} the image repeats horizontally - \o \c{repeat-y} the image repeats vertically - \endlist + methods such as \o \c{document.images} and \o + \c{document.getElementById}. For example: + + \code + <canvas id="demo1" width="100" height="150"></canvas> + + var canvas = document.getElementById("demo1"); + var context = canvas.getContext("2d"); + \endcode + + \o \c{repetition} is the direction in which the image repeats to form + the pattern. Possible values are: + + \list + + \o \c{repeat} (default) the image repeats both horizontally and + vertically + + \o \c{repeat-x} the image repeats horizontally + + \o \c{repeat-y} the image repeats vertically + + \endlist + \endlist The repeated images are the same size as the source image. The @@ -659,32 +759,40 @@ graphic.onload = function(){ \section1 Applying Colors -To draw the outline of a shape in color, set the \c{strokeStyle} attribute to -any valid \l{CSS Color Value}{CSS color value}. The color value can be in -hexadecimal notation or in RGB/HSL notation, as described in \l{Specifying Color -and Opacity}. For example, either of the following sets a shape's outline to -red: +To draw the outline of a shape in color, +set the \c{strokeStyle} attribute to any valid +\l{http://www.w3schools.com/css/css_colors.asp}{CSS color value}. +The color value can be in hexadecimal notation or in RGB/HSL notation, +as described in \l{Specifying Color and Opacity}. +For example, +either of the following sets a shape\'s outline to red: \code context.strokeStyle = "#FF0000" context.strokeStyle = "rgb(255,0,0)" \endcode -To fill a shape with color, set the \c{fillStyle} attribute to a l{CSS Color -Value}{CSS color value}. The color value can be in hexadecimal notation or in -RGB/HSL notation. For example, either of the following colors a shape's interior -as blue: +To fill a shape with color, +set the \c{fillStyle} attribute to a +\l{http://www.w3schools.com/css/css_colors.asp}{CSS color value}. +The color value can be in hexadecimal notation or in RGB/HSL +notation. +For example, either of the following colors a shape\'s interior as +blue: \code context.fillStyle = "#0000FF" context.fillStyle = "rgb(0,0,255)" \endcode -The \l{CSS3 Color Module specification} extends both RGB and HSL color models to -include a color's opacity, referred to as its \e{alpha}. These extended -models are known as RGBA and HSLA. There are no hexadecimal notations for RGBA -and HSLA values. The following specifies varying levels of opacity for a blue -shape: +The +\l{http://www.w3.org/TR/2003/CR-css3-color-20030514/#numerical}{CSS3 +Color Module specification} extends both RGB and HSL color models to +include a color\'s opacity, +referred to as its \bold{alpha}. +These extended models are known as RGBA and HSLA. +There are no hexadecimal notations for RGBA and HSLA values. +The following specifies varying levels of opacity for a blue shape: \code context.fillStyle = rgba(0, 0, 255, 0) // transparent @@ -692,41 +800,50 @@ context.fillStyle = rgba(0, 0, 255, 0.5) // semi-transparent context.fillStyle = rgba(0, 0, 255, 1) // opaque \endcode -When you set the \c{context.strokeStyle} or \c{context.fillStyle} attributes, -whatever value you set becomes the default value for all subsequently drawn -shapes, until you set a new value. +When you set the \c{context.strokeStyle} or \c{context.fillStyle} +attributes, +whatever value you set becomes the default value for all subsequently +drawn shapes, +until you set a new value. \section2 Applying Gradients - A gradient is a smooth transition between colors. There are two types of - gradients: linear and radial. + A gradient is a smooth transition between colors. There are two types + of gradients: linear and radial. - A linear gradient transitions the color along a line between two points. To - create a linear gradient, call the \c{createLinearGradient} method: + A linear gradient transitions the color along a line between two + points. To create a linear gradient, call the \c{createLinearGradient} + method: \code createLinearGradient(x0, y0, x1, y1) \endcode - where \c{(x0, y0)} is the starting point and \c{(x1, y1)} is the ending - point for the linear gradient. + where \c{(x0, y0)} is the starting point and \c{(x1, y1)} is the ending point + for the linear gradient. - A radial gradient transitions the color along a cone between two circles. To - create a radial gradient, call the \c{createRadialGradient} method: + A radial gradient transitions the color along a cone between two + circles. To create a radial gradient, call the \c{createRadialGradient} + method: \code createRadialGradient(x0, y0, r0, x1, y1, r1) \endcode + where: + \list + \o \c{(x0, y0, r0)} represents the starting circle, whose origin is \c{(x0, y0)} and whose radius is \c{r0}. + \o \c{(x1, y1, r1)} represents the ending circle, whose origin is \c{(x1, y1)} and whose radius is \c{r1}. + \endlist - Gradients must have two or more \e{color stops}, representing color - shifts positioned from \c 0 to \c 1 between to the gradient's starting and + Gradients must have two or more \bold{color stops}, representing color + shifts positioned from 0 to 1 between to the gradient\'s starting and end points or circles: \code @@ -734,56 +851,77 @@ shapes, until you set a new value. \endcode where: + \list + \o \c{position} specifies the position of the color within the already - defined starting and end points or circles, expressed as a number from \c 0 - to \c 1. + defined starting and end points or circles, expressed as a number + from 0 to 1. + \o \c{color} specifies the CSS color at that position. + \endlist - For example, to define a gradient that varies from red to blue horizontally - along a rectangular area: + For example, to define a gradient that varies from red to blue + horizontally along a rectangular area: + \list 1 + \o Create a gradient object: - \code - var redbluegradient = context.createLinearGradient(0,0,100,0); - \endcode + + \code + var redbluegradient = context.createLinearGradient(0,0,100,0); + \endcode + \o Define the color stops: - \code - redbluegradient.addColorStop(0, "rgb(255,0,0)"); // red at the left side of the rectangle - redbluegradient.addColorStop(1, "rgb(0,0,255)"); // blue at the right side of the rectangle - \endcode + + \code + redbluegradient.addColorStop(0, "rgb(255,0,0)"); // red at the left side of the rectangle + redbluegradient.addColorStop(1, "rgb(0,0,255)"); // blue at the right side of the rectangle + \endcode + \o Draw the shape and set a \c{fillStyle} or \c{strokeStyle}: - \code - context.fillStyle = redbluegradient; - context.fillRect(0,0,100,150); - \endcode + + \code + context.fillStyle = redbluegradient; + context.fillRect(0,0,100,150); + \endcode + \endlist To define a gradient that varies from red to blue vertically along a rectangle: + \list 1 + \o Create a gradient object: + \code var redbluegradient = context.createLinearGradient(0,0,0,150); \endcode + \o Define the color stops: + \code redbluegradient.addColorStop(0, "rgb(255,0,0)"); // red at the top of the rectangle redbluegradient.addColorStop(1, "rgb(0,0,255)"); // blue at the bottom of the rectangle \endcode + \o Draw the shape and set a \c{fillStyle} or \c{strokeStyle}: + \code context.fillStyle = redbluegradient; context.fillRect(0,0,100,150); \endcode + \endlist - \note A canvas gradient's color stops behave slightly differently than those - used within non-canvas \l{Gradients}{gradients}. Webkit gradients specify - mandatory \c{from} and \c{to} colors, with optional \c{color-stop} values - for additional color shifts within the overall range of the gradient. For - canvas gradients, even the initial and final colors are defined as color + \bold{NOTE:} A canvas gradient\'s color stops behave slightly + differently than those used within non-canvas \l{Gradients}{CSS3 + Webkit gradients}. Webkit gradients specify mandatory \c{from} and + \c{to} colors, with optional \c{color-stop} values for additional + color shifts within the overall range of the gradient. For canvas + gradients, even the initial and final colors are defined as color stops. \section2 Applying Shadows @@ -792,22 +930,25 @@ shapes, until you set a new value. attributes: \list - \o \c{shadowColor} sets the color of the shadow. The value can be any CSS - color value. The default value is transparent black (\c{"rgba(0,0,0,0)"}). - \o \c{shadowBlur} sets the amount of blur in the shadow, in pixels. The - value can be any positive number or 0. A value of 0 produces a sharp shadow - with no blur. + \o \c{shadowColor} sets the color of the shadow. The value can be any + CSS color value. The default value is transparent black (\c{"rgba(0,0,0,0)"}). + + \o \c{shadowBlur} sets the amount of blur in the shadow, in + pixels. The value can be any positive number or 0. A value of 0 + produces a sharp shadow with no blur. \o \c{shadowOffsetX} sets the number of pixels the shadow extends - horizontally from the object drawn. If this value is a positive number, the - shadow extends to the right of the object. If negative, the shadow extends - to the left of the object. The default value is 0 pixels. - - \o \c{shadowOffsetY} sets the number of pixels the shadow extends vertically - from the object drawn. If this value is a positive number, the shadow - extends below the object. If negative, the shadow extends above the object. - The default value is 0 pixels. + horizontally from the object drawn. If this value is a positive + number, the shadow extends to the right of the object. If negative, + the shadow extends to the left of the object. The default value is 0 + pixels. + + \o \c{shadowOffsetY} sets the number of pixels the shadow extends + vertically from the object drawn. If this value is a positive number, + the shadow extends below the object. If negative, the shadow extends + above the object. The default value is 0 pixels. + \endlist The following example code adds a semi-transparent black shadow to the @@ -825,45 +966,57 @@ shapes, until you set a new value. \section1 Transforming Graphics -When drawing shapes and paths, you can translate the canvas's origin, rotate the -canvas around the origin, scale the units in the canvas grid, and modify the -transformation matrix directly. +When drawing shapes and paths, you can translate the canvas\'s origin, +rotate the canvas around the origin, scale the units in the canvas +grid, and modify the transformation matrix directly. \section2 Translating the Canvas Origin - Translating the origin enables you to draw patterns of different objects on - the canvas without having to measure the coordinates manually for each - shape. To translate the origin of the canvas, use the \c{translate} method: + Translating the origin enables you to draw patterns of different + objects on the canvas without having to measure the coordinates + manually for each shape. To translate the origin of the canvas, use + the \c{translate} method: + \code context.translate(x,y); \endcode + where: + \list + \o \c{x} is the horizontal distance that the origin is translated, in coordinate space units + \o \c{y} is the vertical distance that the origin is translated, in coordinate space units + \endlist \section2 Rotating the Canvas To rotate the canvas around the current origin, call the \c{rotate()} method: + \code context.rotate(angle); \endcode + where \c{angle} is the clockwise rotation angle in radians. + The number of radians is the number of degrees multiplied by \pi/180, expressed in JavaScript as: + \code var radians = (Math.PI/180)*degrees; \endcode + \image webkit-guide/canvas_rotate.png \section2 Scaling the Canvas Grid - To increase or decrease the size of each unit in the canvas grid, call the - \c{scale} method: + To increase or decrease the size of each unit in the canvas grid, call + the \c{scale} method: \code context.scale(x,y); @@ -880,42 +1033,59 @@ transformation matrix directly. \endlist The scale factors are in multiples. For example, \c{scale(2.0, 0.5)} would - double the horizontal size of an object drawn on the canvas and half its - vertical size, as shown below: + double the horizontal size of an object drawn on the canvas and half + its vertical size, as shown below: \image webkit-guide/canvas_scale.png \section2 Manipulating the Transformation Matrix - Modifying the transformation matrix directly enables you to perform scaling, - rotating, and translating transformations in a single step. + Modifying the transformation matrix directly enables you to perform + scaling, rotating, and translating transformations in a single step. - The transformation matrix is an \e{affine transformation} matrix from linear - algebra. Affine transformations preserve colinearity and relative distance - in the transformed coordinate space. This means that points in a line remain - in a line, parallel lines remain parallel, and the distance between lines - and objects maintains the same ratio, even if a scale factor is applied. - Repositioning by translation, rotation, or skewing is also possible. + The transformation matrix is an affine transformation matrix from + linear algebra. Affine transformations preserve colinearity and + relative distance in the transformed coordinate space. This means that + points in a line remain in a line, parallel lines remain parallel, and + the distance between lines and objects maintains the same ratio, even + if a scale factor is applied. Repositioning by translation, rotation, + or skewing is also possible. - Each point on the canvas is multiplied by the matrix before anything is - drawn. The \l{HTML5 Canvas API} defines the transformation matrix as: + Each point on the canvas is multiplied by the matrix before anything + is drawn. The HTML5 canvas API defines the transformation matrix as: \image webkit-guide/canvas_math.png + where: + \list + \o \c{a} is the scale factor in the horizontal (x) direction + \image webkit-guide/canvas_scalex.png + \o \c{c} is the skew factor in the x direction + \image webkit-guide/canvas_skewx.png + \o \c{e} is the translation in the x direction + \image webkit-guide/canvas_translate.png + \o \c{b} is the skew factor in the y (vertical) direction + \image webkit-guide/canvas_skewy.png + \o \c{d} is the scale factor in the y direction + \image webkit-guide/canvas_scaley.png + \o \c{f} is the translation in the y direction + \image webkit-guide/canvas_translatey.png + \o the last row remains constant + \endlist The scale factors and skew factors are multiples; \c{e} and \c{f} are @@ -926,89 +1096,114 @@ transformation matrix directly. \image webkit-guide/canvas_math_rotate.png - where the \c angle of rotation is in radians. + where the angle of rotation is in radians. - \bold{See Also:} + \sa \l{http://www.senocular.com/flash/tutorials/transformmatrix/}{senocular.com} for a good explanation of how transformation matrices are used - identically within Adobe Flash. + identically within Flash. \section1 Canvas Animations -You can animate a canvas drawing by repeatedly redrawing the canvas for each -frame and translating, rotating, skewing, and scaling the drawn objects. - -To draw each frame by employing the HTML5 canvas API, you should define the -original canvas state and save it for future reference. The drawing context -maintains a stack of drawing states. Each state consists of the current -transformation matrix, current clipping region, and current values of the -following attributes: -\list -\o\c{strokeStyle} -\o\c{fillStyle} -\o\c{globalAlpha} -\o\c{lineWidth} -\o\c{lineCap} -\o\c{lineJoin} -\o\c{miterLimit} -\o\c{shadowOffsetX} -\o\c{shadowOffsetY} -\o\c{shadowBlur} -\o\c{shadowColor} -\o\c{globalCompositeOperation} -\o\c{font} -\o\c{textAlign} -\o\c{textBaseline} -\endlist -The current path and the current bitmap are NOT part of the drawing state. -The path can be reset only by invoking the \c{beginPath()} method. The current -bitmap is a property of the canvas, not of the context. +You can animate a canvas drawing by repeatedly redrawing the canvas +for each frame and translating, +rotating, +skewing, +and scaling the drawn objects. + +To draw each frame by employing the HTML5 canvas API, +you should define the original canvas state and save it for future +reference. +The drawing context maintains a stack of drawing states. +Each state consists of the current transformation matrix, +current clipping region, +and current values of the following attributes: +\c{strokeStyle}, +\c{fillStyle}, +\c{globalAlpha}, +\c{lineWidth}, +\c{lineCap}, +\c{lineJoin}, +\c{miterLimit}, +\c{shadowOffsetX}, +\c{shadowOffsetY}, +\c{shadowBlur}, +\c{shadowColor}, +\c{globalCompositeOperation}, +\c{font}, +\c{textAlign}, +and +\c{textBaseline}. +The current path and the current bitmap are NOT part of the drawing +state. +The path can be reset only by invoking the \c{beginPath()} method. +The current bitmap is a property of the canvas, +not of the context. + +To save the original canvas state, +call the \c{save()} method: -To save the original canvas state, call the \c{save()} method: \code context.save(); \endcode -Before drawing each new frame, you must clear the canvas: +Before drawing each new frame, +you must clear the canvas: + \code canvas.clearRect(x,y,width,height); \endcode + where: + \list -\o \c{x} is the position of the top left corner of the canvas on the horizontal -axis -\o \c{y} is the position of the top left corner of the canvas on the vertical -axis + +\o \c{x} is the position of the top left corner of the canvas on the +horizontal axis + +\o \c{y} is the position of the top left corner of the canvas on the +vertical axis + \o \c{width} is the width of the canvas + \o \c{height} is the height of the canvas + \endlist -Draw the new frame using any of the methods provided by the canvas API. Then -save it by calling the \c{save()} method. +Draw the new frame using any of the methods provided by the canvas +API. +Then save it by calling the \c{save()} method. -If you wish to return to the state of the original frame as the basis for each -new frame that you draw, call the \c{context.restore()} method. +If you wish to return to the state of the original frame as the basis +for each new frame that you draw, +call the \c{context.restore()} method. + +To execute the drawing methods repeatedly, +use the standard JavaScript-based animation technique, +calling the \c{setInterval()} and \c{clearInterval()} methods. +The following shows how to execute an animation function every 50 +milliseconds (corresponding to 20 times per second, +a typical animation frame rate), +then subsequently halt the animation: -To execute the drawing methods repeatedly, use the standard JavaScript-based -animation technique, calling the \c{setInterval()} and \c{clearInterval()} -methods. The following shows how to execute an animation function every \c 50 -milliseconds (corresponding to 20 times per second, a typical animation frame -rate), then subsequently halt the animation: \code var id = setInterval(functionName, 50); clearInterval(id); \endcode \bold{See Also:} + \list + \o -\l{http://www.canvasdemos.com/2009/10/09/html-5-canvas-animation/}{CanvasDemos.com: animated cartoon}, which discusses how to use Canvas as an animation framework. +\l{http://www.canvasdemos.com/2009/10/09/html-5-canvas-animation/}{CanvasDemos.com: +animated cartoon}, +which discusses how to use Canvas as an animation framework. \o \l{http://blog.nihilogic.dk/2009/02/html5-canvas-cheat-sheet.html}{nihilogic.dk: HTML5 Canvas Cheat Sheet} -\o \l{QtWebKit Guide} -back to the main page \endlist */ diff --git a/doc/src/webkit/guide/chapter_css.qdoc b/doc/src/webkit/guide/chapter_css.qdoc index 32c06b5..9dd35bc 100644 --- a/doc/src/webkit/guide/chapter_css.qdoc +++ b/doc/src/webkit/guide/chapter_css.qdoc @@ -42,7 +42,7 @@ \page qtwebkit-guide-css.html -\title QtWebKit Guide - Level 3 CSS +\title Level 3 CSS (BETA) \chapter Level 3 CSS This section of the Qt WebKit Guide serves as an introduction to various Level 3 CSS features @@ -1504,10 +1504,6 @@ examples provided here illustrate some CSS-only alternatives. manipulate a series of panels. Separate \c{-webkit-animation-delay} settings for each panel control the sequence of each presentation. - -\list -\o \l{QtWebKit Guide} -back to the main page -\endlist */ /*! diff --git a/doc/src/webkit/guide/guidelinks.qdoc b/doc/src/webkit/guide/guidelinks.qdoc index b4f7f98..379b182 100644 --- a/doc/src/webkit/guide/guidelinks.qdoc +++ b/doc/src/webkit/guide/guidelinks.qdoc @@ -455,34 +455,6 @@ /*! \externalpage http://www.w3.org/TR/selectors-api/ \title Selectors API -*/ - -/*! -\externalpage http://dev.w3.org/html5/webstorage/ -\title HTML5 Web Storage -*/ - -/*! -\externalpage http://html5doctor.com/introducing-web-sql-databases -\title HTML5 Doctor: Introducing Web SQL Databases -*/ - -/*! -\externalpage http://dev.w3.org/html5/canvas-api/canvas-2d-api.html -\title HTML5 Canvas API -*/ - -/*! -\externalpage http://www.w3schools.com/css/css_colors.asp -\title CSS Color Value -*/ -/*! -\externalpage http://www.w3.org/TR/2003/CR-css3-color-20030514/#numerical -\title CSS3 Color Module specification */ -/*! -\externalpage http://www.canvasdemos.com/2009/10/09/html-5-canvas-animation -\title CanvasDemos.com: animated cartoon -*/ diff --git a/doc/src/webkit/webkit.qdoc b/doc/src/webkit/webkit.qdoc index 759a7f7..78d27fa 100644 --- a/doc/src/webkit/webkit.qdoc +++ b/doc/src/webkit/webkit.qdoc @@ -94,10 +94,10 @@ technologies to create mobile applications with QtWebKit. Contents: \list -\o \l{QtWebKit Guide - Level 3 CSS}{Level 3 CSS: media queries, selectors, visual +\o \l{Level 3 CSS}{Level 3 CSS: media queries, selectors, visual effects, transforms, transitions, and animations} \o \l{Canvas Graphics}{HTML5 canvas element} -\o \l{QtWebKit Guide - Client Storage}{Client Storage} +\o \l{Client Storage} \endlist */ diff --git a/examples/webkit/webkit-guide/webkit-guide.pro b/examples/webkit/webkit-guide/webkit-guide.pro new file mode 100644 index 0000000..0ae81df --- /dev/null +++ b/examples/webkit/webkit-guide/webkit-guide.pro @@ -0,0 +1,258 @@ +#A simple .pro file to make Qt aware of the webkit-guide files. +#For documentation generation +#TEMPLATE += subdirs + +SOURCES = anim_accord.htm \ +anim_demo-rotate.htm \ +anim_demo-scale.htm \ +anim_demo-skew.htm \ +anim_gallery.htm \ +anim_panel.htm \ +anim_pulse.htm \ +anim_skew.htm \ +anim_slide1.htm \ +anim_slide2.htm \ +anim_slide3.htm \ +anim_tabbedSkew.htm \ +_copyright.txt \ +css3_backgrounds.htm \ +css3_border-img.htm \ +css3_gradientBack.htm \ +css3_gradientBackStop.htm \ +css3_gradientButton.htm \ +css3_grad-radial.htm \ +css3_mask-grad.htm \ +css3_mask-img.htm \ +css3_multicol.htm \ +css3_reflect.htm \ +css3_scroll.htm \ +css3_sel-nth.htm \ +css3_shadow.htm \ +css3_text-overflow.htm \ +css3_text-shadow.htm \ +css3_text-stroke.htm \ +form_tapper.htm \ +form_toggler.htm \ +_image_assets.htm \ +_index.html \ +layout_link-fmt.htm \ +layout_tbl-keyhole.htm \ +mob_condjs.htm \ +mob_layout.htm \ +mob_mediaquery.htm \ +storage.htm \ +css/anim_accord.css \ +css/anim_demo-rotate.css \ +css/anim_demo-scale.css \ +css/anim_demo-skew.css \ +css/anim_gallery.css \ +css/anim_panel.css \ +css/anim_pulse.css \ +css/anim_skew.css \ +css/anim_slide.css \ +css/anim_tabbedSkew.css \ +css/css3_backgrounds.css \ +css/css3_border-img.css \ +css/css3_gradientBack.css \ +css/css3_gradientBackStop.css \ +css/css3_gradientButton.css \ +css/css3_grad-radial.css \ +css/css3_mask-grad.css \ +css/css3_mask-img.css \ +css/css3_multicol.css \ +css/css3_reflect.css \ +css/css3_scroll.css \ +css/css3_sel-nth.css \ +css/css3_shadowBlur.css \ +css/css3_shadow.css \ +css/css3_text-overflow.css \ +css/css3_text-shadow.css \ +css/css3_text-stroke.css \ +css/form_tapper.css \ +css/form_toggler.css \ +css/layout_link-fmt.css \ +css/layout_tbl-keyhole.css \ +css/mob_condjs.css \ +css/mobile.css \ +css/mob_mediaquery.css \ +css/mq_desktop.css \ +css/mqlayout_desktop.css \ +css/mqlayout_mobile.css \ +css/mqlayout_touch.css \ +css/mq_mobile.css \ +css/mq_touch.css \ +css/storage.css \ +img/border-frame.png \ +img/gal0.png \ +img/gal1.png \ +img/gal2.png \ +img/gal3.png \ +img/gal4.png \ +img/gal5.png \ +img/gal6.png \ +img/gal7.png \ +img/gal8.png \ +img/gradient.jpg \ +img/gray_icon_close.png \ +img/ic_ag_016.png \ +img/ic_ag_032.png \ +img/ic_ag_036.png \ +img/ic_ag_048.png \ +img/ic_al_016.png \ +img/ic_al_032.png \ +img/ic_al_036.png \ +img/ic_al_048.png \ +img/ic_ar_016.png \ +img/ic_ar_032.png \ +img/ic_ar_036.png \ +img/ic_ar_048.png \ +img/ic_b_016.png \ +img/ic_b_032.png \ +img/ic_b_036.png \ +img/ic_b_048.png \ +img/ic_be_016.png \ +img/ic_be_032.png \ +img/ic_be_036.png \ +img/ic_be_048.png \ +img/ic_c_016.png \ +img/ic_c_032.png \ +img/ic_c_036.png \ +img/ic_c_048.png \ +img/ic_ca_016.png \ +img/ic_ca_032.png \ +img/ic_ca_036.png \ +img/ic_ca_048.png \ +img/ic_cl_016.png \ +img/ic_cl_032.png \ +img/ic_cl_036.png \ +img/ic_cl_048.png \ +img/ic_cu_016.png \ +img/ic_cu_032.png \ +img/ic_cu_036.png \ +img/ic_cu_048.png \ +img/ic_f_016.png \ +img/ic_f_032.png \ +img/ic_f_036.png \ +img/ic_f_048.png \ +img/ic_fe_016.png \ +img/ic_fe_032.png \ +img/ic_fe_036.png \ +img/ic_fe_048.png \ +img/ic_h_016.png \ +img/ic_h_032.png \ +img/ic_h_036.png \ +img/ic_h_048.png \ +img/ic_he_016.png \ +img/ic_he_032.png \ +img/ic_he_036.png \ +img/ic_he_048.png \ +img/ic_k_016.png \ +img/ic_k_032.png \ +img/ic_k_036.png \ +img/ic_k_048.png \ +img/ic_li_016.png \ +img/ic_li_032.png \ +img/ic_li_036.png \ +img/ic_li_048.png \ +img/ic_mg_016.png \ +img/ic_mg_032.png \ +img/ic_mg_036.png \ +img/ic_mg_048.png \ +img/ic_n_016.png \ +img/ic_n_032.png \ +img/ic_n_036.png \ +img/ic_n_048.png \ +img/ic_na_016.png \ +img/ic_na_032.png \ +img/ic_na_036.png \ +img/ic_na_048.png \ +img/ic_ne_016.png \ +img/ic_ne_032.png \ +img/ic_ne_036.png \ +img/ic_ne_048.png \ +img/ic_ni_016.png \ +img/ic_ni_032.png \ +img/ic_ni_036.png \ +img/ic_ni_048.png \ +img/ic_o_016.png \ +img/ic_o_032.png \ +img/ic_o_036.png \ +img/ic_o_048.png \ +img/icon_check.png \ +img/icon_check_x24green.png \ +img/icon_dismiss.png \ +img/icon_dismiss_x22.png \ +img/icon_drill-down.png \ +img/icon_drill-down_x32.png \ +img/icon_drill-up.png \ +img/icon_drill-up_x32.png \ +img/icon_expand-nav.png \ +img/icon_head-collapsed.png \ +img/icon_head-collapsed_x13.png \ +img/icon_head-expanded.png \ +img/icon_head-expanded_x13.png \ +img/icon_info.png \ +img/icon_info_x24.png \ +img/icon_link-doc.png \ +img/icon_link-email.png \ +img/icon_link-external.png \ +img/icon_link-pdf.png \ +img/icon_link-ppt.png \ +img/icon_link-rss.png \ +img/icon_link-sms.png \ +img/icon_link-tel.png \ +img/icon_link-xls.png \ +img/icon_list-all_circ.png \ +img/icon_list-all.png \ +img/icon_nav_end.png \ +img/icon_nav-start.png \ +img/icon_nav-top.png \ +img/icon_nav-up.png \ +img/icon_question.png \ +img/icon_scroll-left.png \ +img/icon_scroll-right.png \ +img/icon_trash.png \ +img/ic_pt_016.png \ +img/ic_pt_032.png \ +img/ic_pt_036.png \ +img/ic_pt_048.png \ +img/ic_si_016.png \ +img/ic_si_032.png \ +img/ic_si_036.png \ +img/ic_si_048.png \ +img/ic_zn_016.png \ +img/ic_zn_032.png \ +img/ic_zn_036.png \ +img/ic_zn_048.png \ +img/land1.png \ +img/land2.png \ +img/land3.png \ +img/land4.png \ +img/land5.png \ +img/land6.png \ +img/land7.png \ +img/land8.png \ +img/mask.png \ +img/tnail_gal1.png \ +img/tnail_gal2.png \ +img/tnail_gal3.png \ +img/tnail_gal4.png \ +img/tnail_gal5.png \ +img/tnail_gal6.png \ +img/tnail_gal7.png \ +img/tnail_gal8.png \ +js/anim_accord.js \ +js/anim_gallery.js \ +js/anim_panel.js \ +js/anim_skew.js \ +js/css3_backgrounds.js \ +js/css3_border-img.js \ +js/css3_grad-radial.js \ +js/css3_mask-grad.js \ +js/css3_mask-img.js \ +js/css3_text-overflow.js \ +js/form_tapper.js \ +js/mob_condjs.js \ +js/mobile.js \ +js/storage.js \ + |