Chromium Code Reviews| Index: src/image/SkSurface.cpp |
| diff --git a/src/image/SkSurface.cpp b/src/image/SkSurface.cpp |
| index 3a28e421a880df9ff6ae9962aa504c6bd63bb040..7150cffa4b7965c0bf0142a56de8f1845ca92ec2 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,25 @@ static SkSurface_Base* asSB(SkSurface* surface) { |
| /////////////////////////////////////////////////////////////////////////////// |
|
robertphillips
2014/09/19 18:25:37
Use CopyOrLegacy?
reed1
2014/09/19 19:16:34
Done.
|
| -SkSurface::SkSurface(int width, int height) : fWidth(width), fHeight(height) { |
| +static SkSurfaceProps props_or_default(const SkSurfaceProps* props) { |
| + if (props) { |
| + return *props; |
| + } else { |
| + return SkSurfaceProps(SkSurfaceProps::kLegacyFontHost_InitType); |
| + } |
| +} |
| + |
| +SkSurface::SkSurface(int width, int height, const SkSurfaceProps* props) |
| + : fProps(props_or_default(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(props_or_default(props)), fWidth(info.width()), fHeight(info.height()) |
| +{ |
| SkASSERT(fWidth >= 0); |
| SkASSERT(fHeight >= 0); |
| fGenerationID = 0; |
| @@ -119,3 +172,53 @@ 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, |
| + RenderTargetFlags flags) { |
| + SkSurfaceProps props = make_props(trm); |
| + return NewRenderTargetDirect(target, &props, flags); |
| +} |
| + |
| +SkSurface* SkSurface::NewRenderTarget(GrContext* gr, const SkImageInfo& info, int sampleCount, |
| + TextRenderMode trm, RenderTargetFlags flags) { |
| + SkSurfaceProps props = make_props(trm); |
| + return NewRenderTarget(gr, info, sampleCount, &props, flags); |
| +} |
| + |
|
robertphillips
2014/09/19 18:25:37
overlength
|
| +SkSurface* SkSurface::NewScratchRenderTarget(GrContext* gr, const SkImageInfo& info, int sampleCount, |
| + TextRenderMode trm, RenderTargetFlags flags) { |
| + SkSurfaceProps props = make_props(trm); |
| + return NewScratchRenderTarget(gr, info, sampleCount, &props, flags); |
| +} |
| + |
| +#endif |
| + |
| +#if !SK_SUPPORT_GPU |
| + |
| +SkSurface* SkSurface::NewRenderTargetDirect(GrRenderTarget*, const SkSurfaceProps*, |
| + RenderTargetFlags) { |
| + return NULL; |
| +} |
| + |
| +SkSurface* SkSurface::NewRenderTarget(GrContext*, const SkImageInfo&, int, const SkSurfaceProps*, |
| + RenderTargetFlags) { |
| + return NULL; |
| +} |
| + |
| +SkSurface* SkSurface::NewScratchRenderTarget(GrContext*, const SkImageInfo&, int, |
| + const SkSurfaceProps*, RenderTargetFlags) { |
| + return NULL; |
| +} |
| + |
| +#endif |