From 474a12c4976b3000174cad5df74c498cd723c5e2 Mon Sep 17 00:00:00 2001 From: "reed@android.com" Date: Mon, 4 Jan 2010 19:35:33 +0000 Subject: [PATCH] Added a virtual to SkBounder, called by text, that passes the glyph's ID as well as its bounds. Made the universal doIRect() non-abstract so that a child class can override either the general flavor or the text flavor. git-svn-id: http://skia.googlecode.com/svn/trunk@468 2bbb7eff-a529-9590-31e7-b0007b416f81 --- include/core/SkBounder.h | 13 +++++++++++-- src/core/SkDraw.cpp | 7 ++++++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/include/core/SkBounder.h b/include/core/SkBounder.h index f20961d2e..00fbbc6b6 100644 --- a/include/core/SkBounder.h +++ b/include/core/SkBounder.h @@ -38,7 +38,7 @@ public: Returns the result from onIRect. */ bool doIRect(const SkIRect&); - + bool doIRect(const SkIRect& , uint16_t glyphID); protected: /** Override in your subclass. This is called with the device bounds of an object (text, geometry, image) just before it is drawn. If your method @@ -46,7 +46,16 @@ protected: returns true, drawing continues. The bounds your method receives have already been transformed in to device coordinates, and clipped to the current clip. */ - virtual bool onIRect(const SkIRect&) = 0; + virtual bool onIRect(const SkIRect&) { + return false; + } + + /** Optionally, override in your subclass to receive the glyph ID when + text drawing supplies the device bounds of the object. + */ + virtual bool onIRect(const SkIRect& r, uint16_t glyphID) { + return onIRect(r); + } /** Called after each shape has been drawn. The default implementation does nothing, but your override could use this notification to signal itself diff --git a/src/core/SkDraw.cpp b/src/core/SkDraw.cpp index 4f28cfea5..78c282e13 100644 --- a/src/core/SkDraw.cpp +++ b/src/core/SkDraw.cpp @@ -1366,7 +1366,7 @@ static void D1G_Bounder(const SkDraw1Glyph& state, } } - if (state.fBounder->doIRect(cr)) { + if (state.fBounder->doIRect(cr, glyph.getGlyphID())) { mask.fRowBytes = glyph.rowBytes(); mask.fFormat = static_cast(glyph.fMaskFormat); mask.fImage = (uint8_t*)aa; @@ -2244,6 +2244,11 @@ bool SkBounder::doIRect(const SkIRect& r) { return rr.intersect(fClip->getBounds(), r) && this->onIRect(rr); } +bool SkBounder::doIRect(const SkIRect& r, uint16_t glyphID) { + SkIRect rr; + return rr.intersect(fClip->getBounds(), r) && this->onIRect(rr, glyphID); +} + bool SkBounder::doHairline(const SkPoint& pt0, const SkPoint& pt1, const SkPaint& paint) { SkIRect r;