| Index: src/image/SkSurface.cpp | 
| diff --git a/src/image/SkSurface.cpp b/src/image/SkSurface.cpp | 
| index 3a28e421a880df9ff6ae9962aa504c6bd63bb040..861515dd8347d955a70e3222c10f5229ec157a9b 100644 | 
| --- a/src/image/SkSurface.cpp | 
| +++ b/src/image/SkSurface.cpp | 
| @@ -9,14 +9,56 @@ | 
| #include "SkImagePriv.h" | 
| #include "SkCanvas.h" | 
|  | 
| +#include "SkFontLCDConfig.h" | 
| +static SkPixelGeometry compute_default_geometry() { | 
| +    SkFontLCDConfig::LCDOrder order = SkFontLCDConfig::GetSubpixelOrder(); | 
| +    if (SkFontLCDConfig::kNONE_LCDOrder == order) { | 
| +        return kUnknown_SkPixelGeometry; | 
| +    } else { | 
| +        // Bit0 is RGB(0), BGR(1) | 
| +        // Bit1 is H(0), V(1) | 
| +        const SkPixelGeometry gGeo[] = { | 
| +            kRGB_H_SkPixelGeometry, | 
| +            kBGR_H_SkPixelGeometry, | 
| +            kRGB_V_SkPixelGeometry, | 
| +            kBGR_V_SkPixelGeometry, | 
| +        }; | 
| +        int index = 0; | 
| +        if (SkFontLCDConfig::kBGR_LCDOrder == order) { | 
| +            index |= 1; | 
| +        } | 
| +        if (SkFontLCDConfig::kVertical_LCDOrientation == SkFontLCDConfig::GetSubpixelOrientation()){ | 
| +            index |= 2; | 
| +        } | 
| +        return gGeo[index]; | 
| +    } | 
| +} | 
| + | 
| +SkSurfaceProps::SkSurfaceProps() : fFlags(0), fPixelGeometry(kUnknown_SkPixelGeometry) {} | 
| + | 
| +SkSurfaceProps::SkSurfaceProps(InitType) : fFlags(0), fPixelGeometry(compute_default_geometry()) {} | 
| + | 
| +SkSurfaceProps::SkSurfaceProps(uint32_t flags, InitType) | 
| +    : fFlags(flags) | 
| +    , fPixelGeometry(compute_default_geometry()) | 
| +{} | 
| + | 
| +SkSurfaceProps::SkSurfaceProps(uint32_t flags, SkPixelGeometry pg) | 
| +    : fFlags(flags), fPixelGeometry(pg) | 
| +{} | 
| + | 
| /////////////////////////////////////////////////////////////////////////////// | 
|  | 
| -SkSurface_Base::SkSurface_Base(int width, int height) : INHERITED(width, height) { | 
| +SkSurface_Base::SkSurface_Base(int width, int height, const SkSurfaceProps* props) | 
| +    : INHERITED(width, height, props) | 
| +{ | 
| fCachedCanvas = NULL; | 
| fCachedImage = NULL; | 
| } | 
|  | 
| -SkSurface_Base::SkSurface_Base(const SkImageInfo& info) : INHERITED(info) { | 
| +SkSurface_Base::SkSurface_Base(const SkImageInfo& info, const SkSurfaceProps* props) | 
| +    : INHERITED(info, props) | 
| +{ | 
| fCachedCanvas = NULL; | 
| fCachedImage = NULL; | 
| } | 
| @@ -31,8 +73,7 @@ SkSurface_Base::~SkSurface_Base() { | 
| SkSafeUnref(fCachedCanvas); | 
| } | 
|  | 
| -void SkSurface_Base::onDraw(SkCanvas* canvas, SkScalar x, SkScalar y, | 
| -                            const SkPaint* paint) { | 
| +void SkSurface_Base::onDraw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPaint* paint) { | 
| SkImage* image = this->newImageSnapshot(); | 
| if (image) { | 
| image->draw(canvas, x, y, paint); | 
| @@ -74,13 +115,17 @@ static SkSurface_Base* asSB(SkSurface* surface) { | 
|  | 
| /////////////////////////////////////////////////////////////////////////////// | 
|  | 
| -SkSurface::SkSurface(int width, int height) : fWidth(width), fHeight(height) { | 
| +SkSurface::SkSurface(int width, int height, const SkSurfaceProps* props) | 
| +    : fProps(SkSurfacePropsCopyOrDefault(props)), fWidth(width), fHeight(height) | 
| +{ | 
| SkASSERT(fWidth >= 0); | 
| SkASSERT(fHeight >= 0); | 
| fGenerationID = 0; | 
| } | 
|  | 
| -SkSurface::SkSurface(const SkImageInfo& info) : fWidth(info.width()), fHeight(info.height()) { | 
| +SkSurface::SkSurface(const SkImageInfo& info, const SkSurfaceProps* props) | 
| +    : fProps(SkSurfacePropsCopyOrDefault(props)), fWidth(info.width()), fHeight(info.height()) | 
| +{ | 
| SkASSERT(fWidth >= 0); | 
| SkASSERT(fHeight >= 0); | 
| fGenerationID = 0; | 
| @@ -119,3 +164,50 @@ void SkSurface::draw(SkCanvas* canvas, SkScalar x, SkScalar y, | 
| const void* SkSurface::peekPixels(SkImageInfo* info, size_t* rowBytes) { | 
| return this->getCanvas()->peekPixels(info, rowBytes); | 
| } | 
| + | 
| +////////////////////////////////////////////////////////////////////////////////////// | 
| +#ifdef SK_SUPPORT_LEGACY_TEXTRENDERMODE | 
| + | 
| +static SkSurfaceProps make_props(SkSurface::TextRenderMode trm) { | 
| +    uint32_t propsFlags = 0; | 
| +    if (SkSurface::kDistanceField_TextRenderMode == trm) { | 
| +        propsFlags |= SkSurfaceProps::kUseDistanceFieldFonts_Flag; | 
| +    } | 
| +    return SkSurfaceProps(propsFlags, SkSurfaceProps::kLegacyFontHost_InitType); | 
| +} | 
| + | 
| +SkSurface* SkSurface::NewRenderTargetDirect(GrRenderTarget* target, TextRenderMode trm) { | 
| +    SkSurfaceProps props = make_props(trm); | 
| +    return NewRenderTargetDirect(target, &props); | 
| +} | 
| + | 
| +SkSurface* SkSurface::NewRenderTarget(GrContext* gr, const SkImageInfo& info, int sampleCount, | 
| +                                      TextRenderMode trm) { | 
| +    SkSurfaceProps props = make_props(trm); | 
| +    return NewRenderTarget(gr, info, sampleCount, &props); | 
| +} | 
| + | 
| +SkSurface* SkSurface::NewScratchRenderTarget(GrContext* gr, const SkImageInfo& info, int sampleCount, | 
| +                                             TextRenderMode trm) { | 
| +    SkSurfaceProps props = make_props(trm); | 
| +    return NewScratchRenderTarget(gr, info, sampleCount, &props); | 
| +} | 
| + | 
| +#endif | 
| + | 
| +#if !SK_SUPPORT_GPU | 
| + | 
| +SkSurface* SkSurface::NewRenderTargetDirect(GrRenderTarget*, const SkSurfaceProps*) { | 
| +    return NULL; | 
| +} | 
| + | 
| +SkSurface* SkSurface::NewRenderTarget(GrContext*, const SkImageInfo&, int, const SkSurfaceProps*) { | 
| +    return NULL; | 
| +} | 
| + | 
| +SkSurface* SkSurface::NewScratchRenderTarget(GrContext*, const SkImageInfo&, int sampleCount, | 
| +                                             const SkSurfaceProps*) { | 
| +    return NULL; | 
| +} | 
| + | 
| +#endif | 
|  |