aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/core/SkPaint.h2
-rw-r--r--src/core/SkDraw.cpp2
-rw-r--r--src/core/SkGlyph.h58
-rwxr-xr-xsrc/core/SkGlyphCache.cpp2
-rw-r--r--src/core/SkScalerContext.cpp2
-rw-r--r--src/core/SkScalerContext.h2
-rw-r--r--src/fonts/SkTestScalerContext.cpp6
-rwxr-xr-xsrc/gpu/GrBitmapTextContext.cpp2
-rw-r--r--src/gpu/GrPathRendering.cpp2
-rwxr-xr-xsrc/ports/SkFontHost_win.cpp10
-rw-r--r--src/ports/SkScalerContext_win_dw.h2
11 files changed, 53 insertions, 37 deletions
diff --git a/include/core/SkPaint.h b/include/core/SkPaint.h
index 50fe1f4c1d..5f02662d71 100644
--- a/include/core/SkPaint.h
+++ b/include/core/SkPaint.h
@@ -24,7 +24,7 @@ class SkDescriptor;
struct SkDeviceProperties;
class SkReadBuffer;
class SkWriteBuffer;
-struct SkGlyph;
+class SkGlyph;
struct SkRect;
class SkGlyphCache;
class SkImageFilter;
diff --git a/src/core/SkDraw.cpp b/src/core/SkDraw.cpp
index f40c1bbcb0..b6738e2429 100644
--- a/src/core/SkDraw.cpp
+++ b/src/core/SkDraw.cpp
@@ -1534,7 +1534,7 @@ SkDraw1Glyph::Proc SkDraw1Glyph::init(const SkDraw* draw, SkBlitter* blitter, Sk
fPaint = &pnt;
if (cache->isSubpixel()) {
- fHalfSampleX = fHalfSampleY = (SK_FixedHalf >> SkGlyph::kSubBits);
+ fHalfSampleX = fHalfSampleY = SkGlyph::kSubpixelRound;
} else {
fHalfSampleX = fHalfSampleY = SK_FixedHalf;
}
diff --git a/src/core/SkGlyph.h b/src/core/SkGlyph.h
index 9abefa84c7..4a9acbfe75 100644
--- a/src/core/SkGlyph.h
+++ b/src/core/SkGlyph.h
@@ -13,6 +13,7 @@
#include "SkMask.h"
class SkPath;
+class SkGlyphCache;
// needs to be != to any valid SkMask::Format
#define MASK_FORMAT_UNKNOWN (0xFF)
@@ -20,12 +21,23 @@ class SkPath;
#define kMaxGlyphWidth (1<<13)
-struct SkGlyph {
+class SkGlyph {
+ enum {
+ kSubBits = 2,
+ kSubMask = ((1 << kSubBits) - 1),
+ kSubShift = 24, // must be large enough for glyphs and unichars
+ kCodeMask = ((1 << kSubShift) - 1),
+ // relative offsets for X and Y subpixel bits
+ kSubShiftX = kSubBits,
+ kSubShiftY = 0
+ };
+
+ public:
+ static const SkFixed kSubpixelRound = SK_FixedHalf >> SkGlyph::kSubBits;
void* fImage;
SkPath* fPath;
SkFixed fAdvanceX, fAdvanceY;
- uint32_t fID;
uint16_t fWidth, fHeight;
int16_t fTop, fLeft;
@@ -33,12 +45,12 @@ struct SkGlyph {
int8_t fRsbDelta, fLsbDelta; // used by auto-kerning
int8_t fForceBW;
- void init(uint32_t id) {
- fID = id;
- fImage = NULL;
- fPath = NULL;
- fMaskFormat = MASK_FORMAT_UNKNOWN;
- fForceBW = 0;
+ void initWithGlyphID(uint32_t glyph_id) {
+ this->initCommon(MakeID(glyph_id));
+ }
+
+ void initGlyphIdFrom(const SkGlyph& glyph) {
+ this->initCommon(glyph.fID);
}
/**
@@ -94,18 +106,22 @@ struct SkGlyph {
*/
void zeroMetrics();
- enum {
- kSubBits = 2,
- kSubMask = ((1 << kSubBits) - 1),
- kSubShift = 24, // must be large enough for glyphs and unichars
- kCodeMask = ((1 << kSubShift) - 1),
- // relative offsets for X and Y subpixel bits
- kSubShiftX = kSubBits,
- kSubShiftY = 0
- };
+ void toMask(SkMask* mask) const;
+
+ private:
+ // TODO(herb) remove friend statement after SkGlyphCache cleanup.
+ friend class SkGlyphCache;
+
+ void initCommon(uint32_t id) {
+ fID = id;
+ fImage = NULL;
+ fPath = NULL;
+ fMaskFormat = MASK_FORMAT_UNKNOWN;
+ fForceBW = 0;
+ }
static unsigned ID2Code(uint32_t id) {
- return id & kCodeMask;
+ return (id & kCodeMask);
}
static unsigned ID2SubX(uint32_t id) {
@@ -134,11 +150,11 @@ struct SkGlyph {
x = FixedToSub(x);
y = FixedToSub(y);
return (x << (kSubShift + kSubShiftX)) |
- (y << (kSubShift + kSubShiftY)) |
- code;
+ (y << (kSubShift + kSubShiftY)) |
+ code;
}
- void toMask(SkMask* mask) const;
+ uint32_t fID;
};
#endif
diff --git a/src/core/SkGlyphCache.cpp b/src/core/SkGlyphCache.cpp
index 57c54bfc1e..f0fd859385 100755
--- a/src/core/SkGlyphCache.cpp
+++ b/src/core/SkGlyphCache.cpp
@@ -314,7 +314,7 @@ SkGlyph* SkGlyphCache::lookupMetrics(uint32_t id, MetricsType mtype) {
glyph = (SkGlyph*)fGlyphAlloc.alloc(sizeof(SkGlyph),
SkChunkAlloc::kThrow_AllocFailType);
- glyph->init(id);
+ glyph->initCommon(id);
*fGlyphArray.insert(hi) = glyph;
if (kJustAdvance_MetricsType == mtype) {
diff --git a/src/core/SkScalerContext.cpp b/src/core/SkScalerContext.cpp
index a3ff95ca0a..e3b5d80b3d 100644
--- a/src/core/SkScalerContext.cpp
+++ b/src/core/SkScalerContext.cpp
@@ -482,7 +482,7 @@ void SkScalerContext::getImage(const SkGlyph& origGlyph) {
SkMask::kARGB32_Format != origGlyph.fMaskFormat);
if (fMaskFilter) { // restore the prefilter bounds
- tmpGlyph.init(origGlyph.fID);
+ tmpGlyph.initGlyphIdFrom(origGlyph);
// need the original bounds, sans our maskfilter
SkMaskFilter* mf = fMaskFilter;
diff --git a/src/core/SkScalerContext.h b/src/core/SkScalerContext.h
index 4677635d7c..02b3a76825 100644
--- a/src/core/SkScalerContext.h
+++ b/src/core/SkScalerContext.h
@@ -14,7 +14,7 @@
#include "SkPaint.h"
#include "SkTypeface.h"
-struct SkGlyph;
+class SkGlyph;
class SkDescriptor;
class SkMaskFilter;
class SkPathEffect;
diff --git a/src/fonts/SkTestScalerContext.cpp b/src/fonts/SkTestScalerContext.cpp
index b9aa6c7de6..fc1f9456e2 100644
--- a/src/fonts/SkTestScalerContext.cpp
+++ b/src/fonts/SkTestScalerContext.cpp
@@ -117,7 +117,7 @@ SkTestTypeface::SkTestTypeface(SkTestFont* testFont, const SkFontStyle& style)
}
void SkTestTypeface::getAdvance(SkGlyph* glyph) {
- glyph->fAdvanceX = fTestFont->fWidths[SkGlyph::ID2Code(glyph->fID)];
+ glyph->fAdvanceX = fTestFont->fWidths[glyph->getGlyphID()];
glyph->fAdvanceY = 0;
}
@@ -126,12 +126,12 @@ void SkTestTypeface::getFontMetrics(SkPaint::FontMetrics* metrics) {
}
void SkTestTypeface::getMetrics(SkGlyph* glyph) {
- glyph->fAdvanceX = fTestFont->fWidths[SkGlyph::ID2Code(glyph->fID)];
+ glyph->fAdvanceX = fTestFont->fWidths[glyph->getGlyphID()];
glyph->fAdvanceY = 0;
}
void SkTestTypeface::getPath(const SkGlyph& glyph, SkPath* path) {
- *path = *fTestFont->fPaths[SkGlyph::ID2Code(glyph.fID)];
+ *path = *fTestFont->fPaths[glyph.getGlyphID()];
}
void SkTestTypeface::onFilterRec(SkScalerContextRec* rec) const {
diff --git a/src/gpu/GrBitmapTextContext.cpp b/src/gpu/GrBitmapTextContext.cpp
index 30c9205627..2345ac1f4c 100755
--- a/src/gpu/GrBitmapTextContext.cpp
+++ b/src/gpu/GrBitmapTextContext.cpp
@@ -140,7 +140,7 @@ void GrBitmapTextContext::onDrawText(GrRenderTarget* rt, const GrPaint& paint,
SkFixed fyMask = ~0;
SkFixed halfSampleX, halfSampleY;
if (cache->isSubpixel()) {
- halfSampleX = halfSampleY = (SK_FixedHalf >> SkGlyph::kSubBits);
+ halfSampleX = halfSampleY = SkGlyph::kSubpixelRound;
SkAxisAlignment baseline = SkComputeAxisAlignmentForHText(viewMatrix);
if (kX_SkAxisAlignment == baseline) {
fyMask = 0;
diff --git a/src/gpu/GrPathRendering.cpp b/src/gpu/GrPathRendering.cpp
index c7f2d9df54..456f6d84c0 100644
--- a/src/gpu/GrPathRendering.cpp
+++ b/src/gpu/GrPathRendering.cpp
@@ -30,7 +30,7 @@ public:
void generatePath(int glyphID, SkPath* out) SK_OVERRIDE {
SkGlyph skGlyph;
- skGlyph.init(SkGlyph::MakeID(glyphID));
+ skGlyph.initWithGlyphID(glyphID);
fScalerContext->getMetrics(&skGlyph);
fScalerContext->getPath(skGlyph, out);
diff --git a/src/ports/SkFontHost_win.cpp b/src/ports/SkFontHost_win.cpp
index 7d39da2149..67927fd81c 100755
--- a/src/ports/SkFontHost_win.cpp
+++ b/src/ports/SkFontHost_win.cpp
@@ -1580,17 +1580,17 @@ DWORD SkScalerContext_GDI::getGDIGlyphPath(const SkGlyph& glyph, UINT flags,
{
GLYPHMETRICS gm;
- DWORD total_size = GetGlyphOutlineW(fDDC, glyph.fID, flags, &gm, BUFFERSIZE, glyphbuf->get(), &fMat22);
+ DWORD total_size = GetGlyphOutlineW(fDDC, glyph.getGlyphID(), flags, &gm, BUFFERSIZE, glyphbuf->get(), &fMat22);
// Sometimes GetGlyphOutlineW returns a number larger than BUFFERSIZE even if BUFFERSIZE > 0.
// It has been verified that this does not involve a buffer overrun.
if (GDI_ERROR == total_size || total_size > BUFFERSIZE) {
// GDI_ERROR because the BUFFERSIZE was too small, or because the data was not accessible.
// When the data is not accessable GetGlyphOutlineW fails rather quickly,
// so just try to get the size. If that fails then ensure the data is accessible.
- total_size = GetGlyphOutlineW(fDDC, glyph.fID, flags, &gm, 0, NULL, &fMat22);
+ total_size = GetGlyphOutlineW(fDDC, glyph.getGlyphID(), flags, &gm, 0, NULL, &fMat22);
if (GDI_ERROR == total_size) {
LogFontTypeface::EnsureAccessible(this->getTypeface());
- total_size = GetGlyphOutlineW(fDDC, glyph.fID, flags, &gm, 0, NULL, &fMat22);
+ total_size = GetGlyphOutlineW(fDDC, glyph.getGlyphID(), flags, &gm, 0, NULL, &fMat22);
if (GDI_ERROR == total_size) {
// GetGlyphOutlineW is known to fail for some characters, such as spaces.
// In these cases, just return that the glyph does not have a shape.
@@ -1600,10 +1600,10 @@ DWORD SkScalerContext_GDI::getGDIGlyphPath(const SkGlyph& glyph, UINT flags,
glyphbuf->reset(total_size);
- DWORD ret = GetGlyphOutlineW(fDDC, glyph.fID, flags, &gm, total_size, glyphbuf->get(), &fMat22);
+ DWORD ret = GetGlyphOutlineW(fDDC, glyph.getGlyphID(), flags, &gm, total_size, glyphbuf->get(), &fMat22);
if (GDI_ERROR == ret) {
LogFontTypeface::EnsureAccessible(this->getTypeface());
- ret = GetGlyphOutlineW(fDDC, glyph.fID, flags, &gm, total_size, glyphbuf->get(), &fMat22);
+ ret = GetGlyphOutlineW(fDDC, glyph.getGlyphID(), flags, &gm, total_size, glyphbuf->get(), &fMat22);
if (GDI_ERROR == ret) {
SkASSERT(false);
return 0;
diff --git a/src/ports/SkScalerContext_win_dw.h b/src/ports/SkScalerContext_win_dw.h
index 12ca5d5c6b..5c13eab615 100644
--- a/src/ports/SkScalerContext_win_dw.h
+++ b/src/ports/SkScalerContext_win_dw.h
@@ -15,7 +15,7 @@
#include <dwrite.h>
-struct SkGlyph;
+class SkGlyph;
class SkDescriptor;
class SkScalerContext_DW : public SkScalerContext {