Index: skia/ports/SkFontHost_ascender.cpp |
=================================================================== |
--- skia/ports/SkFontHost_ascender.cpp (revision 16859) |
+++ skia/ports/SkFontHost_ascender.cpp (working copy) |
@@ -1,211 +0,0 @@ |
-#include "SkScalerContext.h" |
-#include "SkBitmap.h" |
-#include "SkCanvas.h" |
-#include "SkDescriptor.h" |
-#include "SkFDot6.h" |
-#include "SkFontHost.h" |
-#include "SkMask.h" |
-#include "SkStream.h" |
-#include "SkString.h" |
-#include "SkThread.h" |
-#include "SkTemplates.h" |
- |
-#include <acaapi.h> |
- |
-////////////////////////////////////////////////////////////////////////// |
- |
-#include "SkMMapStream.h" |
- |
-class SkScalerContext_Ascender : public SkScalerContext { |
-public: |
- SkScalerContext_Ascender(const SkDescriptor* desc); |
- virtual ~SkScalerContext_Ascender(); |
- |
-protected: |
- virtual unsigned generateGlyphCount() const; |
- virtual uint16_t generateCharToGlyph(SkUnichar uni); |
- virtual void generateMetrics(SkGlyph* glyph); |
- virtual void generateImage(const SkGlyph& glyph); |
- virtual void generatePath(const SkGlyph& glyph, SkPath* path); |
- virtual void generateFontMetrics(SkPaint::FontMetrics* mx, SkPaint::FontMetrics* my); |
- |
-private: |
- aca_FontHandle fHandle; |
- void* fWorkspace; |
- void* fGlyphWorkspace; |
- SkStream* fFontStream; |
- SkStream* fHintStream; |
-}; |
- |
-/////////////////////////////////////////////////////////////////////////// |
-/////////////////////////////////////////////////////////////////////////// |
- |
-SkScalerContext_Ascender::SkScalerContext_Ascender(const SkDescriptor* desc) |
- : SkScalerContext(desc) |
-{ |
- int size = aca_Get_FontHandleRec_Size(); |
- fHandle = (aca_FontHandle)sk_malloc_throw(size); |
- |
- // get the pointer to the font |
- |
- fFontStream = new SkMMAPStream("/UcsGB2312-Hei-H.FDL"); |
- fHintStream = new SkMMAPStream("/genv6-23.bin"); |
- |
- void* hints = sk_malloc_throw(fHintStream->getLength()); |
- memcpy(hints, fHintStream->getMemoryBase(), fHintStream->getLength()); |
- |
- aca_Create_Font_Handle(fHandle, |
- (void*)fFontStream->getMemoryBase(), fFontStream->getLength(), |
- "fred", |
- hints, fHintStream->getLength()); |
- |
- // compute our factors from the record |
- |
- SkMatrix m; |
- |
- fRec.getSingleMatrix(&m); |
- |
- // now compute our scale factors |
- SkScalar sx = m.getScaleX(); |
- SkScalar sy = m.getScaleY(); |
- |
- int ppemX = SkScalarRound(sx); |
- int ppemY = SkScalarRound(sy); |
- |
- size = aca_Find_Font_Memory_Required(fHandle, ppemX, ppemY); |
- size *= 8; // Jeff suggests this :) |
- fWorkspace = sk_malloc_throw(size); |
- aca_Set_Font_Memory(fHandle, (uint8_t*)fWorkspace, size); |
- |
- aca_GlyphAttribsRec rec; |
- |
- memset(&rec, 0, sizeof(rec)); |
- rec.xSize = ppemX; |
- rec.ySize = ppemY; |
- rec.doAdjust = true; |
- rec.doExceptions = true; |
- rec.doGlyphHints = true; |
- rec.doInterpolate = true; |
- rec.grayMode = 2; |
- aca_Set_Font_Attributes(fHandle, &rec, &size); |
- |
- fGlyphWorkspace = sk_malloc_throw(size); |
- aca_Set_Glyph_Memory(fHandle, fGlyphWorkspace); |
-} |
- |
-SkScalerContext_Ascender::~SkScalerContext_Ascender() |
-{ |
- delete fHintStream; |
- delete fFontStream; |
- sk_free(fGlyphWorkspace); |
- sk_free(fWorkspace); |
- sk_free(fHandle); |
-} |
- |
-unsigned SkScalerContext_Ascender::generateGlyphCount() const |
-{ |
- return 1000; |
-} |
- |
-uint16_t SkScalerContext_Ascender::generateCharToGlyph(SkUnichar uni) |
-{ |
- return (uint16_t)(uni & 0xFFFF); |
-} |
- |
-void SkScalerContext_Ascender::generateMetrics(SkGlyph* glyph) |
-{ |
- glyph->fRsbDelta = 0; |
- glyph->fLsbDelta = 0; |
- |
- aca_GlyphImageRec rec; |
- aca_Vector topLeft; |
- |
- int adv = aca_Get_Adv_Width(fHandle, glyph->getGlyphID()); |
- if (aca_GLYPH_NOT_PRESENT == adv) |
- goto ERROR; |
- |
- aca_Rasterize(glyph->getGlyphID(), fHandle, &rec, &topLeft); |
- |
- if (false) // error |
- { |
-ERROR: |
- glyph->fWidth = 0; |
- glyph->fHeight = 0; |
- glyph->fTop = 0; |
- glyph->fLeft = 0; |
- glyph->fAdvanceX = 0; |
- glyph->fAdvanceY = 0; |
- return; |
- } |
- |
- glyph->fWidth = rec.width; |
- glyph->fHeight = rec.rows; |
- glyph->fRowBytes = rec.width; |
- glyph->fTop = -topLeft.y; |
- glyph->fLeft = topLeft.x; |
- glyph->fAdvanceX = SkIntToFixed(adv); |
- glyph->fAdvanceY = SkIntToFixed(0); |
-} |
- |
-void SkScalerContext_Ascender::generateImage(const SkGlyph& glyph) |
-{ |
- aca_GlyphImageRec rec; |
- aca_Vector topLeft; |
- |
- aca_Rasterize(glyph.getGlyphID(), fHandle, &rec, &topLeft); |
- |
- const uint8_t* src = (const uint8_t*)rec.buffer; |
- uint8_t* dst = (uint8_t*)glyph.fImage; |
- int height = glyph.fHeight; |
- |
- src += rec.y0 * rec.pitch + rec.x0; |
- while (--height >= 0) |
- { |
- memcpy(dst, src, glyph.fWidth); |
- src += rec.pitch; |
- dst += glyph.fRowBytes; |
- } |
-} |
- |
-/////////////////////////////////////////////////////////////////////////////////////////// |
- |
-void SkScalerContext_Ascender::generatePath(const SkGlyph& glyph, SkPath* path) |
-{ |
- SkRect r; |
- |
- r.set(0, 0, SkIntToScalar(4), SkIntToScalar(4)); |
- path->reset(); |
- path->addRect(r); |
-} |
- |
-void SkScalerContext_Ascender::generateFontMetrics(SkPaint::FontMetrics* mx, SkPaint::FontMetrics* my) |
-{ |
- if (NULL == mx && NULL == my) |
- return; |
- |
- if (mx) |
- { |
- mx->fTop = SkIntToScalar(-16); |
- mx->fAscent = SkIntToScalar(-16); |
- mx->fDescent = SkIntToScalar(4); |
- mx->fBottom = SkIntToScalar(4); |
- mx->fLeading = 0; |
- } |
- if (my) |
- { |
- my->fTop = SkIntToScalar(-16); |
- my->fAscent = SkIntToScalar(-16); |
- my->fDescent = SkIntToScalar(4); |
- my->fBottom = SkIntToScalar(4); |
- my->fLeading = 0; |
- } |
-} |
- |
-//////////////////////////////////////////////////////////////////////// |
-//////////////////////////////////////////////////////////////////////// |
- |
-SkScalerContext* SkFontHost::CreateScalerContext(const SkDescriptor* desc) |
-{ |
- return SkNEW_ARGS(SkScalerContext_Ascender, (desc)); |
-} |
- |