-
Notifications
You must be signed in to change notification settings - Fork 143
Custom graphics functions
As of Hypergrid v1.3.0 you can add custom methods to the 2d graphics context to customize certain graphics operations at a low level.
Depending on this approach is not necessarily recommended, and usually shouldn't be necessary with proper planning. But it is a way for cell renderer authors to provide hooks for possible unanticipated future needs. Cell renderers can be written using specially named custom methods that default to native methods. Future applications can override these defaults with their own methods and thereby avoid forking the entire cell renderer just to change one minor aspect of rendering.
We have tested this capability in Chrome, FireFox, Safari, and Internet Explorer.
- Such methods are naturally visible to cell renderers through their 1st parameter (
gc
). - Calling such methods is more performant than calling a local function and passing the graphics context in with
Function.prototype.call
. - Graphics code reads cleanly.
Custom graphics context methods can be "installed" (assinged) declaratively or programmatically.
Consider for example the included SimpleCell
renderer. Instead of calling gc.fillText
it calls a custom method gc.simpleText
. The default for gc.simpleText
is preset to gc.fillText
on grid instantiation; if you don't override it, you get the default fillText
functionality. (See Defining alias defaults below.)
Declarative installation is made before grid instantiation. Use this type of installation when you know which custom method implementation to use for a custom method.
To assign an implementation to simpleText
declaratively, add it to the graphics
object.
var graphics = fin.Hypergrid.lib.graphics; // if using build file
var graphics = require('fin-hypergrid/src/lib/graphics'); // if using npm module
graphics.simpleText = myCustomFillTextMethod;
All members of this object are automatically assigned to each grid's graphics context objects (grid.canvas.gc
and grid.canvas.bs
) on instantiation.
Programmatic installation is made to a running grid (after instantiation). Use this type of installation when you need to assign or reassign custom methods on the fly based on logic only known at run-time.
To override an aliased method with a custom implementation programmatically:
var grid = new Hypergrid;
grid.canvas.gc.simpleText = grid.canvas.bc.simpleText = myCustomFillTextMethod;
The default graphics context aliases (method synonyms) are defined in src/lib/Canvas.js:
var Canvas = fin.Hypergrid.lib.Canvas; // if using build file
var Canvas = require('fin-hypergrid/src/lib/Canvas'); // if using npm module
Canvas.graphicsContextAliases = {
simpleText: 'fillText'
};
For example, to register altFont
as an alias for gc.font
, do the following before instantiating any grid objects:
Canvas.graphicsContextAliases.altFont = 'font';
In general, all cell renderers that use custom methods should set their defaults as shown above in case no implementation is assigned before the method is called. If you don't set a default, you must assign an implementation declaratively before it is needed.
To summarize: On instantiation, each grid gets a Canvas
object with a gc
(graphics context) object (and a similar bc
object) with all aliases pre-assigned as synonyms for their named methods. After instantiation, grid.canvas.gc.simpleText
will hold a reference to grid.canvas.gc.fillText
. Unless overridden, calls to the former are exactly equivalent to calls to the latter in terms of performance (and in every other way).