Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / skia / src / image / SkSurface.cpp
index edc6ef5..b10782a 100644 (file)
@@ -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,11 +73,10 @@ 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);
+        canvas->drawImage(image, x, y, paint);
         image->unref();
     }
 }
@@ -45,7 +86,7 @@ void SkSurface_Base::aboutToDraw(ContentChangeMode mode) {
 
     SkASSERT(!fCachedCanvas || fCachedCanvas->getSurfaceBase() == this);
 
-    if (NULL != fCachedImage) {
+    if (fCachedImage) {
         // the surface may need to fork its backend, if its sharing it with
         // the cached image. Note: we only call if there is an outstanding owner
         // on the image (besides us).
@@ -74,15 +115,16 @@ 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.fWidth)
-    , fHeight(info.fHeight)
+SkSurface::SkSurface(const SkImageInfo& info, const SkSurfaceProps* props)
+    : fProps(SkSurfacePropsCopyOrDefault(props)), fWidth(info.width()), fHeight(info.height())
 {
     SkASSERT(fWidth >= 0);
     SkASSERT(fHeight >= 0);
@@ -122,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