aboutsummaryrefslogtreecommitdiffhomepage
path: root/samplecode/SampleFatBits.cpp
diff options
context:
space:
mode:
authorGravatar reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-10-30 13:41:19 +0000
committerGravatar reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-10-30 13:41:19 +0000
commitbbe66f0824dc47823826f6265879d7a57843fed3 (patch)
treeb078f2a28efe0f6de4cef0ca10f900ce5ddb517c /samplecode/SampleFatBits.cpp
parentb77f0f4ae560e97cc4cd2758752d955549017c3c (diff)
add triangles to fatbits sample ('t')
git-svn-id: http://skia.googlecode.com/svn/trunk@12015 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'samplecode/SampleFatBits.cpp')
-rw-r--r--samplecode/SampleFatBits.cpp109
1 files changed, 89 insertions, 20 deletions
diff --git a/samplecode/SampleFatBits.cpp b/samplecode/SampleFatBits.cpp
index 8159cc5db8..10ec8e5f12 100644
--- a/samplecode/SampleFatBits.cpp
+++ b/samplecode/SampleFatBits.cpp
@@ -20,6 +20,17 @@
#define WIRE_FRAME_COLOR 0xFFFF0000 /*0xFF00FFFF*/
#define WIRE_FRAME_SIZE 1.5f
+static SkScalar apply_grid(SkScalar x) {
+ const SkScalar grid = 2;
+ return SkScalarRoundToScalar(x * grid) / grid;
+}
+
+static void apply_grid(SkPoint pts[], int count) {
+ for (int i = 0; i < count; ++i) {
+ pts[i].set(apply_grid(pts[i].fX), apply_grid(pts[i].fY));
+ }
+}
+
static void erase(SkSurface* surface) {
surface->getCanvas()->clear(SK_ColorTRANSPARENT);
}
@@ -52,6 +63,7 @@ public:
fUseGPU = false;
fUseClip = false;
fRectAsOval = false;
+ fUseTriangle = false;
fClipRect.set(2, 2, 11, 8 );
}
@@ -69,7 +81,10 @@ public:
bool getUseGPU() const { return fUseGPU; }
void setUseGPU(bool ug) { fUseGPU = ug; }
-
+
+ bool getTriangle() const { return fUseTriangle; }
+ void setTriangle(bool ut) { fUseTriangle = ut; }
+
void toggleRectAsOval() { fRectAsOval = !fRectAsOval; }
bool getUseClip() const { return fUseClip; }
@@ -91,19 +106,23 @@ public:
fInverse.setScale(SK_Scalar1 / zoom, SK_Scalar1 / zoom);
fShader->setLocalMatrix(fMatrix);
- fMinSurface.reset(SkSurface::NewRasterPMColor(width, height));
- width *= zoom;
- height *= zoom;
- fMaxSurface.reset(SkSurface::NewRasterPMColor(width, height));
+ SkImage::Info info = {
+ width, height, SkImage::kPMColor_ColorType, SkImage::kPremul_AlphaType
+ };
+ fMinSurface.reset(SkSurface::NewRaster(info));
+ info.fWidth *= zoom;
+ info.fHeight *= zoom;
+ fMaxSurface.reset(SkSurface::NewRaster(info));
}
void drawBG(SkCanvas*);
void drawFG(SkCanvas*);
void drawLine(SkCanvas*, SkPoint pts[2]);
void drawRect(SkCanvas* canvas, SkPoint pts[2]);
+ void drawTriangle(SkCanvas* canvas, SkPoint pts[3]);
private:
- bool fAA, fGrid, fShowSkeleton, fUseGPU, fUseClip, fRectAsOval;
+ bool fAA, fGrid, fShowSkeleton, fUseGPU, fUseClip, fRectAsOval, fUseTriangle;
Style fStyle;
int fW, fH, fZoom;
SkMatrix fMatrix, fInverse;
@@ -132,6 +151,7 @@ private:
paint->setAntiAlias(true);
}
+ void drawTriangleSkeleton(SkCanvas* max, const SkPoint pts[]);
void drawLineSkeleton(SkCanvas* max, const SkPoint pts[]);
void drawRectSkeleton(SkCanvas* max, const SkRect& r) {
SkPaint paint;
@@ -264,11 +284,7 @@ void FatBits::drawLine(SkCanvas* canvas, SkPoint pts[]) {
fInverse.mapPoints(pts, 2);
if (fGrid) {
- SkScalar dd = 0;//SK_Scalar1 / 50;
- pts[0].set(SkScalarRoundToScalar(pts[0].fX) + dd,
- SkScalarRoundToScalar(pts[0].fY) + dd);
- pts[1].set(SkScalarRoundToScalar(pts[1].fX) + dd,
- SkScalarRoundToScalar(pts[1].fY) + dd);
+ apply_grid(pts, 2);
}
erase(fMinSurface);
@@ -300,8 +316,7 @@ void FatBits::drawRect(SkCanvas* canvas, SkPoint pts[2]) {
fInverse.mapPoints(pts, 2);
if (fGrid) {
- pts[0].set(SkScalarRoundToScalar(pts[0].fX), SkScalarRoundToScalar(pts[0].fY));
- pts[1].set(SkScalarRoundToScalar(pts[1].fX), SkScalarRoundToScalar(pts[1].fY));
+ apply_grid(pts, 2);
}
SkRect r;
@@ -325,6 +340,48 @@ void FatBits::drawRect(SkCanvas* canvas, SkPoint pts[2]) {
fMaxSurface->draw(canvas, 0, 0, NULL);
}
+void FatBits::drawTriangleSkeleton(SkCanvas* max, const SkPoint pts[]) {
+ SkPaint paint;
+ this->setupSkeletonPaint(&paint);
+
+ SkPath path;
+ path.moveTo(pts[0]);
+ path.lineTo(pts[1]);
+ path.lineTo(pts[2]);
+ path.close();
+
+ max->drawPath(path, paint);
+}
+
+void FatBits::drawTriangle(SkCanvas* canvas, SkPoint pts[3]) {
+ SkPaint paint;
+
+ fInverse.mapPoints(pts, 3);
+
+ if (fGrid) {
+ apply_grid(pts, 3);
+ }
+
+ SkPath path;
+ path.moveTo(pts[0]);
+ path.lineTo(pts[1]);
+ path.lineTo(pts[2]);
+ path.close();
+
+ erase(fMinSurface);
+ this->setupPaint(&paint);
+ paint.setColor(FAT_PIXEL_COLOR);
+ fMinSurface->getCanvas()->drawPath(path, paint);
+ this->copyMinToMax();
+
+ SkCanvas* max = fMaxSurface->getCanvas();
+
+ fMatrix.mapPoints(pts, 3);
+ this->drawTriangleSkeleton(max, pts);
+
+ fMaxSurface->draw(canvas, 0, 0, NULL);
+}
+
///////////////////////////////////////////////////////////////////////////////////////////////////
class IndexClick : public SkView::Click {
@@ -339,13 +396,14 @@ public:
class DrawLineView : public SampleView {
FatBits fFB;
- SkPoint fPts[2];
+ SkPoint fPts[3];
bool fIsRect;
public:
DrawLineView() {
fFB.setWHZ(24, 16, 48);
fPts[0].set(48, 48);
fPts[1].set(48 * 5, 48 * 4);
+ fPts[2].set(48 * 2, 48 * 6);
fIsRect = false;
}
@@ -398,6 +456,10 @@ protected:
fFB.setUseGPU(!fFB.getUseGPU());
this->inval(NULL);
return true;
+ case 't':
+ fFB.setTriangle(!fFB.getTriangle());
+ this->inval(NULL);
+ return true;
}
}
return this->INHERITED::onQuery(evt);
@@ -405,7 +467,10 @@ protected:
virtual void onDrawContent(SkCanvas* canvas) {
fFB.drawBG(canvas);
- if (fIsRect) {
+ if (fFB.getTriangle()) {
+ fFB.drawTriangle(canvas, fPts);
+ }
+ else if (fIsRect) {
fFB.drawRect(canvas, fPts);
} else {
fFB.drawLine(canvas, fPts);
@@ -431,24 +496,28 @@ protected:
unsigned modi) SK_OVERRIDE {
SkPoint pt = { x, y };
int index = -1;
+ int count = fFB.getTriangle() ? 3 : 2;
SkScalar tol = 12;
- if (fPts[0].equalsWithinTolerance(pt, tol)) {
- index = 0;
- } else if (fPts[1].equalsWithinTolerance(pt, tol)) {
- index = 1;
+
+ for (int i = 0; i < count; ++i) {
+ if (fPts[i].equalsWithinTolerance(pt, tol)) {
+ index = i;
+ break;
+ }
}
return new IndexClick(this, index);
}
virtual bool onClick(Click* click) SK_OVERRIDE {
int index = IndexClick::GetIndex(click);
- if (index >= 0 && index <= 1) {
+ if (index >= 0 && index <= 2) {
fPts[index] = click->fCurr;
} else {
SkScalar dx = click->fCurr.fX - click->fPrev.fX;
SkScalar dy = click->fCurr.fY - click->fPrev.fY;
fPts[0].offset(dx, dy);
fPts[1].offset(dx, dy);
+ fPts[2].offset(dx, dy);
}
this->inval(NULL);
return true;