| #include "SampleCode.h" | 
 | #include "SkView.h" | 
 | #include "SkCanvas.h" | 
 | #include "Sk64.h" | 
 | #include "SkGradientShader.h" | 
 | #include "SkGraphics.h" | 
 | #include "SkImageDecoder.h" | 
 | #include "SkKernel33MaskFilter.h" | 
 | #include "SkPath.h" | 
 | #include "SkRandom.h" | 
 | #include "SkRegion.h" | 
 | #include "SkShader.h" | 
 | #include "SkUtils.h" | 
 | #include "SkColorPriv.h" | 
 | #include "SkColorFilter.h" | 
 | #include "SkTime.h" | 
 | #include "SkTypeface.h" | 
 | #include "SkXfermode.h" | 
 |  | 
 | static void lettersToBitmap(SkBitmap* dst, const char chars[], | 
 |                             const SkPaint& original, SkBitmap::Config config) { | 
 |     SkPath path; | 
 |     SkScalar x = 0; | 
 |     SkScalar width; | 
 |     SkPath p; | 
 |     for (size_t i = 0; i < strlen(chars); i++) { | 
 |         original.getTextPath(&chars[i], 1, x, 0, &p); | 
 |         path.addPath(p); | 
 |         original.getTextWidths(&chars[i], 1, &width); | 
 |         x += width; | 
 |     } | 
 |     SkRect bounds = path.getBounds(); | 
 |     SkScalar sw = -original.getStrokeWidth(); | 
 |     bounds.inset(sw, sw); | 
 |     path.offset(-bounds.fLeft, -bounds.fTop); | 
 |     bounds.offset(-bounds.fLeft, -bounds.fTop); | 
 |      | 
 |     int w = SkScalarRound(bounds.width()); | 
 |     int h = SkScalarRound(bounds.height()); | 
 |     SkPaint paint(original); | 
 |     SkBitmap src; | 
 |     src.setConfig(config, w, h); | 
 |     src.allocPixels(); | 
 |     src.eraseColor(0); | 
 |     { | 
 |         SkCanvas canvas(src); | 
 |         paint.setAntiAlias(true); | 
 |         paint.setColor(SK_ColorBLACK); | 
 |         paint.setStyle(SkPaint::kFill_Style); | 
 |         canvas.drawPath(path, paint); | 
 |     } | 
 |      | 
 |     dst->setConfig(config, w, h); | 
 |     dst->allocPixels(); | 
 |     dst->eraseColor(SK_ColorWHITE); | 
 |     { | 
 |         SkCanvas canvas(*dst); | 
 |         paint.setXfermodeMode(SkXfermode::kDstATop_Mode); | 
 |         canvas.drawBitmap(src, 0, 0, &paint); | 
 |         paint.setColor(original.getColor()); | 
 |         paint.setStyle(SkPaint::kStroke_Style); | 
 |         canvas.drawPath(path, paint); | 
 |     } | 
 | } | 
 |  | 
 | static void lettersToBitmap2(SkBitmap* dst, const char chars[], | 
 |                             const SkPaint& original, SkBitmap::Config config) { | 
 |     SkPath path; | 
 |     SkScalar x = 0; | 
 |     SkScalar width; | 
 |     SkPath p; | 
 |     for (size_t i = 0; i < strlen(chars); i++) { | 
 |         original.getTextPath(&chars[i], 1, x, 0, &p); | 
 |         path.addPath(p); | 
 |         original.getTextWidths(&chars[i], 1, &width); | 
 |         x += width; | 
 |     } | 
 |     SkRect bounds = path.getBounds(); | 
 |     SkScalar sw = -original.getStrokeWidth(); | 
 |     bounds.inset(sw, sw); | 
 |     path.offset(-bounds.fLeft, -bounds.fTop); | 
 |     bounds.offset(-bounds.fLeft, -bounds.fTop); | 
 |      | 
 |     int w = SkScalarRound(bounds.width()); | 
 |     int h = SkScalarRound(bounds.height()); | 
 |     SkPaint paint(original); | 
 |  | 
 |     paint.setAntiAlias(true); | 
 |     paint.setXfermodeMode(SkXfermode::kDstATop_Mode); | 
 |     paint.setColor(original.getColor()); | 
 |     paint.setStyle(SkPaint::kStroke_Style); | 
 |      | 
 |     dst->setConfig(config, w, h); | 
 |     dst->allocPixels(); | 
 |     dst->eraseColor(SK_ColorWHITE); | 
 |  | 
 |     SkCanvas canvas(*dst); | 
 |     canvas.drawPath(path, paint); | 
 | } | 
 |  | 
 | class StrokeTextView : public SkView { | 
 |     bool fAA; | 
 | public: | 
 | 	StrokeTextView() : fAA(false) {} | 
 |      | 
 | protected: | 
 |     // overrides from SkEventSink | 
 |     virtual bool onQuery(SkEvent* evt) { | 
 |         if (SampleCode::TitleQ(*evt)) { | 
 |             SampleCode::TitleR(evt, "StrokeText"); | 
 |             return true; | 
 |         } | 
 |         return this->INHERITED::onQuery(evt); | 
 |     } | 
 |      | 
 |     void drawBG(SkCanvas* canvas) { | 
 |         canvas->drawColor(0xFF333333); | 
 |         canvas->drawColor(0xFFCC8844); | 
 |     } | 
 |      | 
 |     virtual void onDraw(SkCanvas* canvas) { | 
 |         this->drawBG(canvas); | 
 |          | 
 |         SkBitmap bm; | 
 |         SkPaint paint; | 
 |          | 
 |         paint.setStrokeWidth(SkIntToScalar(6)); | 
 |         paint.setTextSize(SkIntToScalar(80)); | 
 | //        paint.setTypeface(Typeface.DEFAULT_BOLD); | 
 |          | 
 |         lettersToBitmap(&bm, "Test Case", paint, SkBitmap::kARGB_4444_Config); | 
 |          | 
 |         canvas->drawBitmap(bm, 0, 0); | 
 |     } | 
 |      | 
 | private: | 
 |      | 
 |     typedef SkView INHERITED; | 
 | }; | 
 |  | 
 | ////////////////////////////////////////////////////////////////////////////// | 
 |  | 
 | static SkView* MyFactory() { return new StrokeTextView; } | 
 | static SkViewRegister reg(MyFactory); | 
 |  |