Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(59)

Side by Side Diff: samplecode/SampleBitmap2Path.cpp

Issue 16829003: Adding my Bitmap2Path sample for 1on1 meeting. (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Added suggestions from Mike from CL1 Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « gyp/SampleApp.gyp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 /*
2 * Copyright 2011 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8 #include "SampleCode.h"
9 #include "SkView.h"
10 #include "SkCanvas.h"
11 #include "SkPathOps.h"
12
13 #define CHAR_BIT 8
14 #define SQRT_2 1.41421356237
15
16 bool getBit( const char *buffer,
reed1 2013/06/13 17:58:41 any function local to your file... static bool ...
17 const int x ) {
reed1 2013/06/13 17:58:41 for parameters, const on a non-ptr is never meanin
18
19 int byte = x / CHAR_BIT;
reed1 2013/06/13 17:58:41 nit: when you know your modulus is a power of two,
20 int bit = x % CHAR_BIT;
21
22 return buffer[byte] & (1 << bit);
reed1 2013/06/13 17:58:41 this is not a bool, but an int (which is fine), bu
23 }
24
25
26 void line2path_pixel( SkPath* path,
27 const char* line,
28 const int lineIdx,
29 const int width ) {
30 for (int i=0; i<width; i++) {
31 // simply makes every ON pixel into a rect path
32 if (getBit(line,i)==1) {
33 // add a rect for the pixel
34 SkRect r = { i, lineIdx, i+1, lineIdx+1 };
reed1 2013/06/13 17:58:41 alternate: SkRect::MakeXYWH(i, lineIdx, 1, 1) co
35 path->addRect(r, SkPath::kCW_Direction);
36 }
37 }
38 }
39
40 void line2path_pixelCircle( SkPath* path,
reed1 2013/06/13 17:58:41 all these guys can be marked 'static'
41 const char* line,
42 const int lineIdx,
43 const int width ) {
44 for (int i=0; i<width; i++) {
reed1 2013/06/13 17:58:41 very nitty: need more space, and pre-increment fo
45 // simply makes every ON pixel into a circle path
46 if (getBit(line,i)==1) {
reed1 2013/06/13 17:58:41 if (getBit(...)) {
47 // add a circle for the pixel
48 path->addCircle( i+.5, lineIdx+.5, SQRT_2 / 2.0 );
reed1 2013/06/13 17:58:41 all 3 params will generate doubles... use 0.5f if
49 }
50 }
51 }
52
53 void line2path_span( SkPath* path,
54 const char* line,
55 const int lineIdx,
56 const int width ) {
57 bool state = 0;
58 int start = 1;
59
60 for (int i=0; i<width; i++) {
61 if (i==width-1) { // if the end of a scanline, close open paths
62 if (state==1) {
63 SkRect r = { start, lineIdx,
64 i+getBit(line,i), lineIdx+1 };
65 path->addRect(r, SkPath::kCW_Direction);
66 } else if (getBit(line,i)==1) {
67 SkRect r = { i, lineIdx,
68 i+1, lineIdx+1 };
69 path->addRect(r, SkPath::kCW_Direction);
70 }
71 start = 0;
72 state = 0;
73 // if a transition point:
74 }else if (getBit(line,i)!=state) {
75 if (getBit(line,i)==1) { // transition on
76 state = 1; //mark beginning of span
77 start = i;
78 }else { // transition off
79 state = 0;
80 SkRect r = { start, lineIdx,
81 i, lineIdx+1};
82 path->addRect(r, SkPath::kCW_Direction);
83 }
84 }
85 }
86 }
87
88 void bitmap2path( SkPath* path,
89 const char* bitmap,
90 void (*line2path)( SkPath*,
91 const char*,
92 const int,
93 const int ),
94 const int h, const int w,
95 const int stride ) {
96 // loop for every line in bitmap
97 for (int i=0; i<h; i++) {
98 line2path(path, &bitmap[i*stride], i, w);
99 }
100 }
101
102
103 class Bitmap2Path : public SampleView {
104 public:
105 Bitmap2Path() {
106 }
107
108 protected:
109 // overrides from SkEventSink
110 virtual bool onQuery(SkEvent* evt) {
111 if (SampleCode::TitleQ(*evt)) {
112 SampleCode::TitleR(evt, "Bitmap2Path");
113 return true;
114 }
115 return this->INHERITED::onQuery(evt);
116 }
117
118 virtual void onDrawContent(SkCanvas* canvas) {
119 const char raw_bits[] = {
120 0x99, 0x00,
121 0x5a, 0x00,
122 0x3c, 0x00,
123 0x18, 0x00,
124 0x99, 0x00,
125 0x5a, 0x00,
126 0x3c, 0x00,
127 0x18, 0x00,
128 };
129
130 // pointer into memory for binary bitmap
131 const char* bitmap = (char*) &raw_bits;
132 int h=8, w=8, str=2;
133
134 // array of funtion pointers for modes (allows looping)
135 const int numModes = 3;
136 void (*mode[numModes])( SkPath*, const char*,
reed1 2013/06/13 17:58:41 const void (*.... maybe typdef this guy to a name
137 const int, const int )
138 = { line2path_pixel, line2path_pixelCircle, line2path_span };
139
140 // select paint for drawing binary pixels -- BLACK
141 SkPaint paint;
142 paint.setAntiAlias(true);
143 paint.setStyle(SkPaint::kFill_Style);
144 paint.setColor(SK_ColorBLACK);
145
146 // for each mode
147 for (int i=0; i<numModes; i++)
148 {
149 //convert bitmap to path
150 SkPath path;
151 bitmap2path(&path,bitmap,mode[i],h,w,str);
152
153 //simplify path
154 SkPath simple;
155 Simplify(path, &simple);
156
157 //draw to canvas
158 canvas->save();
159 canvas->scale(10.0, 10.0);
reed1 2013/06/13 17:58:41 more doubles canvas->scale(10, 10);
160 canvas->translate(10.0*i, 0);
161 canvas->drawPath(simple, paint);
162 canvas->restore();
163 }
164
165 // this->inval(NULL);
166 }
167
168 private:
169 typedef SkView INHERITED;
170 };
171
172 //////////////////////////////////////////////////////////////////////////////
173
174 static SkView* MyFactory() { return new Bitmap2Path; }
175 static SkViewRegister reg(MyFactory);
OLDNEW
« no previous file with comments | « gyp/SampleApp.gyp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698