aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXin Qi <xqi@codeaurora.org>2013-10-09 17:00:46 -0700
committerSteve Kondik <steve@cyngn.com>2014-12-11 20:42:18 -0800
commit593368559d83c27e5b2d834b57d048e107e8b123 (patch)
tree97682eb9f8cb5d925058906918c1afdd110e9fde
parentadeb53745ed8a6626528fc0bcd7145420a430c16 (diff)
downloadandroid_external_skia-593368559d83c27e5b2d834b57d048e107e8b123.tar.gz
android_external_skia-593368559d83c27e5b2d834b57d048e107e8b123.tar.bz2
android_external_skia-593368559d83c27e5b2d834b57d048e107e8b123.zip
external/skia Hooks for optimized blitting
Add in hooks to allow for overriding blitting operations with optimized functions Change-Id: If38010a69d9fe7cf412d91c277db666f2fd7df34
-rw-r--r--Android.mk3
-rw-r--r--include/core/SkShader.h8
-rw-r--r--src/core/SkBitmapProcShader.cpp8
-rw-r--r--src/core/SkBitmapProcShader.h7
-rw-r--r--src/core/SkBitmapProcState.cpp6
-rw-r--r--src/core/SkBitmapProcState.h5
-rw-r--r--src/core/SkBlitter_ARGB32.cpp11
-rw-r--r--src/core/SkCoreBlitters.h2
-rw-r--r--src/core/SkShader.cpp6
9 files changed, 53 insertions, 3 deletions
diff --git a/Android.mk b/Android.mk
index 479073f874..cb19f6e3fd 100644
--- a/Android.mk
+++ b/Android.mk
@@ -523,7 +523,8 @@ LOCAL_SHARED_LIBRARIES := \
libicuuc \
libicui18n \
libexpat \
- libft2
+ libft2 \
+ libcutils
LOCAL_STATIC_LIBRARIES := \
libwebp-decode \
diff --git a/include/core/SkShader.h b/include/core/SkShader.h
index 0b7a702cb1..1a36ae67cc 100644
--- a/include/core/SkShader.h
+++ b/include/core/SkShader.h
@@ -167,6 +167,14 @@ public:
* to the specified device coordinates.
*/
virtual void shadeSpan(int x, int y, SkPMColor[], int count) = 0;
+ enum SkShaderIds {
+ kSkBitmapProcShader_Class = 0x1,
+ kSkShader_OtherClass = 0x2,
+ };
+
+ virtual void beginRect(int x, int y, int width);
+ virtual void endRect();
+ virtual SkShaderIds getID() { return kSkShader_OtherClass; }
typedef void (*ShadeProc)(void* ctx, int x, int y, SkPMColor[], int count);
virtual ShadeProc asAShadeProc(void** ctx);
diff --git a/src/core/SkBitmapProcShader.cpp b/src/core/SkBitmapProcShader.cpp
index 8e03a80427..6ae7799381 100644
--- a/src/core/SkBitmapProcShader.cpp
+++ b/src/core/SkBitmapProcShader.cpp
@@ -47,6 +47,14 @@ SkBitmapProcShader::SkBitmapProcShader(SkReadBuffer& buffer)
fTileModeY = buffer.readUInt();
}
+void SkBitmapProcShader::BitmapProcShaderContext::beginRect(int x, int y, int width) {
+ fState->beginRect(x, y, width);
+}
+
+void SkBitmapProcShader::BitmapProcShaderContext::endRect() {
+ fState->endRect();
+}
+
SkShader::BitmapType SkBitmapProcShader::asABitmap(SkBitmap* texture,
SkMatrix* texM,
TileMode xy[]) const {
diff --git a/src/core/SkBitmapProcShader.h b/src/core/SkBitmapProcShader.h
index c12b548a5f..7ae18f05d2 100644
--- a/src/core/SkBitmapProcShader.h
+++ b/src/core/SkBitmapProcShader.h
@@ -41,7 +41,12 @@ public:
BitmapProcShaderContext(const SkBitmapProcShader&, const ContextRec&, SkBitmapProcState*);
virtual ~BitmapProcShaderContext();
- virtual void shadeSpan(int x, int y, SkPMColor dstC[], int count) SK_OVERRIDE;
+ virtual void shadeSpan(int x, int y, SkPMColor dstC[], int count) SK_OVERRIDE __attribute__((weak));
+ // override beginRect and endRect
+ virtual void beginRect(int x, int y, int width);
+ virtual void endRect();
+
+ virtual SkShaderIds getID() { return kSkBitmapProcShader_Class; }
virtual ShadeProc asAShadeProc(void** ctx) SK_OVERRIDE;
virtual void shadeSpan16(int x, int y, uint16_t dstC[], int count) SK_OVERRIDE;
diff --git a/src/core/SkBitmapProcState.cpp b/src/core/SkBitmapProcState.cpp
index 137bcda91f..3605910309 100644
--- a/src/core/SkBitmapProcState.cpp
+++ b/src/core/SkBitmapProcState.cpp
@@ -939,6 +939,12 @@ SkBitmapProcState::ShaderProc32 SkBitmapProcState::chooseShaderProc32() {
return NULL;
}
+void SkBitmapProcState::beginRect(int x, int y, int width) {
+}
+
+void SkBitmapProcState::endRect() {
+}
+
///////////////////////////////////////////////////////////////////////////////
#ifdef SK_DEBUG
diff --git a/src/core/SkBitmapProcState.h b/src/core/SkBitmapProcState.h
index 663bcb8be9..572c30ef6f 100644
--- a/src/core/SkBitmapProcState.h
+++ b/src/core/SkBitmapProcState.h
@@ -136,6 +136,11 @@ struct SkBitmapProcState {
SampleProc32 getSampleProc32() const { return fSampleProc32; }
SampleProc16 getSampleProc16() const { return fSampleProc16; }
+ /* Perform rectaingle geometry specific setup/cleanup */
+ void beginRect(int x, int y, int width) __attribute__((weak));
+ void endRect() __attribute__((weak));
+ void * fOptPtr;
+
private:
friend class SkBitmapProcShader;
diff --git a/src/core/SkBlitter_ARGB32.cpp b/src/core/SkBlitter_ARGB32.cpp
index f86bc47074..d25be761db 100644
--- a/src/core/SkBlitter_ARGB32.cpp
+++ b/src/core/SkBlitter_ARGB32.cpp
@@ -333,6 +333,10 @@ void SkARGB32_Shader_Blitter::blitH(int x, int y, int width) {
}
}
+extern int skia_androidopt_blitRect(int x, int y, int width, int height,
+ SkARGB32_Shader_Blitter *sk, const SkBitmap& fDevice, SkXfermode *fXfermode,
+ SkShader::Context* shaderContext) __attribute__((weak));
+
void SkARGB32_Shader_Blitter::blitRect(int x, int y, int width, int height) {
SkASSERT(x >= 0 && y >= 0 &&
x + width <= fDevice.width() && y + height <= fDevice.height());
@@ -342,6 +346,13 @@ void SkARGB32_Shader_Blitter::blitRect(int x, int y, int width, int height) {
SkShader::Context* shaderContext = fShaderContext;
SkPMColor* span = fBuffer;
+ SkXfermode* xfer = fXfermode;
+ if (skia_androidopt_blitRect) {
+ if (skia_androidopt_blitRect(x, y, width, height, this, fDevice, xfer, shaderContext)) {
+ return;
+ }
+ }
+
if (fConstInY) {
if (fShadeDirectlyIntoDevice) {
// shade the first row directly into the device
diff --git a/src/core/SkCoreBlitters.h b/src/core/SkCoreBlitters.h
index 20f9437ac8..02fe921c4b 100644
--- a/src/core/SkCoreBlitters.h
+++ b/src/core/SkCoreBlitters.h
@@ -161,7 +161,7 @@ public:
SkARGB32_Shader_Blitter(const SkBitmap& device, const SkPaint& paint,
SkShader::Context* shaderContext);
virtual ~SkARGB32_Shader_Blitter();
- virtual void blitH(int x, int y, int width) SK_OVERRIDE;
+ virtual void blitH(int x, int y, int width) SK_OVERRIDE __attribute__((weak));
virtual void blitV(int x, int y, int height, SkAlpha alpha) SK_OVERRIDE;
virtual void blitRect(int x, int y, int width, int height) SK_OVERRIDE;
virtual void blitAntiH(int x, int y, const SkAlpha[], const int16_t[]) SK_OVERRIDE;
diff --git a/src/core/SkShader.cpp b/src/core/SkShader.cpp
index d0067925f6..2d2c01d868 100644
--- a/src/core/SkShader.cpp
+++ b/src/core/SkShader.cpp
@@ -64,6 +64,12 @@ SkShader::~SkShader() {
dec_shader_counter();
}
+void SkShader::Context::beginRect(int x, int y, int width) {
+}
+
+void SkShader::Context::endRect() {
+}
+
void SkShader::flatten(SkWriteBuffer& buffer) const {
this->INHERITED::flatten(buffer);
bool hasLocalM = !fLocalMatrix.isIdentity();