aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core
diff options
context:
space:
mode:
authorGravatar reed@android.com <reed@android.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2009-05-13 14:00:33 +0000
committerGravatar reed@android.com <reed@android.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2009-05-13 14:00:33 +0000
commitf76bacff7f66724072c67edb185abf9e3add11a0 (patch)
tree122df275ab6ffea666b3bb8ebbefaeba1cbe64ef /src/core
parent25e9834c03a050afbf339f457b8c401aecb26c0b (diff)
add SkSize for dimensions
add SkShape baseclass, in the hopes of having SkPicture inherit from that, and also using shapes as the extension mechanism for things like animated-gif git-svn-id: http://skia.googlecode.com/svn/trunk@174 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/core')
-rw-r--r--src/core/SkCanvas.cpp8
-rw-r--r--src/core/SkShape.cpp85
-rw-r--r--src/core/core_files.mk1
3 files changed, 94 insertions, 0 deletions
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
index 199c1b0b97..57b4f7b340 100644
--- a/src/core/SkCanvas.cpp
+++ b/src/core/SkCanvas.cpp
@@ -22,6 +22,7 @@
#include "SkDrawLooper.h"
#include "SkPicture.h"
#include "SkScalarCompare.h"
+#include "SkShape.h"
#include "SkTemplates.h"
#include "SkUtils.h"
#include <new>
@@ -1357,12 +1358,19 @@ void SkCanvas::drawTextOnPathHV(const void* text, size_t byteLength,
this->drawTextOnPath(text, byteLength, path, &matrix, paint);
}
+///////////////////////////////////////////////////////////////////////////////
+
void SkCanvas::drawPicture(SkPicture& picture) {
int saveCount = save();
picture.draw(this);
restoreToCount(saveCount);
}
+void SkCanvas::drawShape(SkShape* shape) {
+ // shape baseclass takes care of save/restore
+ shape->draw(this);
+}
+
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
diff --git a/src/core/SkShape.cpp b/src/core/SkShape.cpp
new file mode 100644
index 0000000000..a6d19af96b
--- /dev/null
+++ b/src/core/SkShape.cpp
@@ -0,0 +1,85 @@
+#include "SkCanvas.h"
+#include "SkShape.h"
+#include "SkMatrix.h"
+
+SkShape::~SkShape() {
+ if (fMatrix) {
+ SkDELETE(fMatrix);
+ }
+}
+
+void SkShape::getMatrix(SkMatrix* matrix) const {
+ if (matrix) {
+ if (fMatrix) {
+ *matrix = *fMatrix;
+ } else {
+ matrix->reset();
+ }
+ }
+}
+
+void SkShape::setMatrix(const SkMatrix& matrix) {
+ if (matrix.isIdentity()) {
+ this->resetMatrix();
+ } else {
+ if (NULL == fMatrix) {
+ fMatrix = SkNEW(SkMatrix);
+ }
+ *fMatrix = matrix;
+ }
+}
+
+void SkShape::resetMatrix() {
+ if (fMatrix) {
+ SkDELETE(fMatrix);
+ fMatrix = NULL;
+ }
+}
+
+void SkShape::draw(SkCanvas* canvas) {
+ int saveCount = canvas->getSaveCount();
+ if (fMatrix) {
+ canvas->save(SkCanvas::kMatrix_SaveFlag);
+ canvas->concat(*fMatrix);
+ }
+ this->onDraw(canvas);
+ canvas->restoreToCount(saveCount);
+}
+
+void SkShape::drawXY(SkCanvas* canvas, SkScalar dx, SkScalar dy) {
+ int saveCount = canvas->save(SkCanvas::kMatrix_SaveFlag);
+ canvas->translate(dx, dy);
+ if (fMatrix) {
+ canvas->concat(*fMatrix);
+ }
+ this->onDraw(canvas);
+ canvas->restoreToCount(saveCount);
+}
+
+void SkShape::drawMatrix(SkCanvas* canvas, const SkMatrix& matrix) {
+ int saveCount = canvas->save(SkCanvas::kMatrix_SaveFlag);
+ canvas->concat(matrix);
+ if (fMatrix) {
+ canvas->concat(*fMatrix);
+ }
+ this->onDraw(canvas);
+ canvas->restoreToCount(saveCount);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+void SkShape::flatten(SkFlattenableWriteBuffer& buffer) {
+ buffer.writeBool(fMatrix != NULL);
+ if (fMatrix) {
+ *(SkMatrix*)buffer.reserve(sizeof(SkMatrix)) = *fMatrix;
+ }
+}
+
+SkShape::SkShape(SkFlattenableReadBuffer& buffer) {
+ fMatrix = NULL;
+ if (buffer.readBool()) {
+ fMatrix = SkNEW(SkMatrix);
+ buffer.read(fMatrix, sizeof(*fMatrix));
+ }
+}
+
diff --git a/src/core/core_files.mk b/src/core/core_files.mk
index 27849e7021..94e19d7255 100644
--- a/src/core/core_files.mk
+++ b/src/core/core_files.mk
@@ -72,6 +72,7 @@ SOURCE := \
SkScan_Hairline.cpp \
SkScan_Path.cpp \
SkShader.cpp \
+ SkShape.cpp \
SkSpriteBlitter_ARGB32.cpp \
SkSpriteBlitter_RGB16.cpp \
SkStream.cpp \