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

Side by Side Diff: core/fxcrt/include/fx_coordinates.h

Issue 2382723003: Move core/fxcrt/include to core/fxcrt (Closed)
Patch Set: Rebase to master Created 4 years, 2 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
« no previous file with comments | « core/fxcrt/include/fx_basic.h ('k') | core/fxcrt/include/fx_ext.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7 #ifndef CORE_FXCRT_INCLUDE_FX_COORDINATES_H_
8 #define CORE_FXCRT_INCLUDE_FX_COORDINATES_H_
9
10 #include "core/fxcrt/include/fx_basic.h"
11
12 class CFX_Matrix;
13
14 template <class BaseType>
15 class CFX_PSTemplate {
16 public:
17 CFX_PSTemplate() : x(0), y(0) {}
18 CFX_PSTemplate(BaseType new_x, BaseType new_y) : x(new_x), y(new_y) {}
19 CFX_PSTemplate(const CFX_PSTemplate& other) : x(other.x), y(other.y) {}
20 void clear() {
21 x = 0;
22 y = 0;
23 }
24 CFX_PSTemplate operator=(const CFX_PSTemplate& other) {
25 if (this != &other) {
26 x = other.x;
27 y = other.y;
28 }
29 return *this;
30 }
31 bool operator==(const CFX_PSTemplate& other) const {
32 return x == other.x && y == other.y;
33 }
34 bool operator!=(const CFX_PSTemplate& other) const {
35 return !(*this == other);
36 }
37 CFX_PSTemplate& operator+=(const CFX_PSTemplate<BaseType>& obj) {
38 x += obj.x;
39 y += obj.y;
40 return *this;
41 }
42 CFX_PSTemplate& operator-=(const CFX_PSTemplate<BaseType>& obj) {
43 x -= obj.x;
44 y -= obj.y;
45 return *this;
46 }
47 CFX_PSTemplate& operator*=(BaseType factor) {
48 x *= factor;
49 y *= factor;
50 return *this;
51 }
52 CFX_PSTemplate& operator/=(BaseType divisor) {
53 x /= divisor;
54 y /= divisor;
55 return *this;
56 }
57 CFX_PSTemplate operator+(const CFX_PSTemplate& other) {
58 return CFX_PSTemplate(x + other.x, y + other.y);
59 }
60 CFX_PSTemplate operator-(const CFX_PSTemplate& other) {
61 return CFX_PSTemplate(x - other.x, y - other.y);
62 }
63 CFX_PSTemplate operator*(BaseType factor) {
64 return CFX_PSTemplate(x * factor, y * factor);
65 }
66 CFX_PSTemplate operator/(BaseType divisor) {
67 return CFX_PSTemplate(x / divisor, y / divisor);
68 }
69
70 BaseType x;
71 BaseType y;
72 };
73 typedef CFX_PSTemplate<int32_t> CFX_Point;
74 typedef CFX_PSTemplate<FX_FLOAT> CFX_PointF;
75 typedef CFX_PSTemplate<int32_t> CFX_Size;
76 typedef CFX_PSTemplate<FX_FLOAT> CFX_SizeF;
77 typedef CFX_ArrayTemplate<CFX_Point> CFX_Points;
78 typedef CFX_ArrayTemplate<CFX_PointF> CFX_PointsF;
79
80 template <class BaseType>
81 class CFX_VTemplate : public CFX_PSTemplate<BaseType> {
82 public:
83 using CFX_PSTemplate<BaseType>::x;
84 using CFX_PSTemplate<BaseType>::y;
85
86 CFX_VTemplate() : CFX_PSTemplate<BaseType>() {}
87 CFX_VTemplate(BaseType new_x, BaseType new_y)
88 : CFX_PSTemplate<BaseType>(new_x, new_y) {}
89
90 CFX_VTemplate(const CFX_VTemplate& other) : CFX_PSTemplate<BaseType>(other) {}
91
92 CFX_VTemplate(const CFX_PSTemplate<BaseType>& point1,
93 const CFX_PSTemplate<BaseType>& point2)
94 : CFX_PSTemplate<BaseType>(point2.x - point1.x, point2.y - point1.y) {}
95
96 FX_FLOAT Length() const { return FXSYS_sqrt(x * x + y * y); }
97 void Normalize() {
98 FX_FLOAT fLen = Length();
99 if (fLen < 0.0001f)
100 return;
101
102 x /= fLen;
103 y /= fLen;
104 }
105 void Translate(BaseType dx, BaseType dy) {
106 x += dx;
107 y += dy;
108 }
109 void Scale(BaseType sx, BaseType sy) {
110 x *= sx;
111 y *= sy;
112 }
113 void Rotate(FX_FLOAT fRadian) {
114 FX_FLOAT cosValue = FXSYS_cos(fRadian);
115 FX_FLOAT sinValue = FXSYS_sin(fRadian);
116 x = x * cosValue - y * sinValue;
117 y = x * sinValue + y * cosValue;
118 }
119 };
120 typedef CFX_VTemplate<int32_t> CFX_Vector;
121 typedef CFX_VTemplate<FX_FLOAT> CFX_VectorF;
122
123 // Rectangles.
124 // TODO(tsepez): Consolidate all these different rectangle classes.
125
126 // LTRB rectangles (y-axis runs downwards).
127 struct FX_RECT {
128 FX_RECT() : left(0), top(0), right(0), bottom(0) {}
129
130 FX_RECT(int l, int t, int r, int b) : left(l), top(t), right(r), bottom(b) {}
131
132 int Width() const { return right - left; }
133 int Height() const { return bottom - top; }
134 bool IsEmpty() const { return right <= left || bottom <= top; }
135
136 bool Valid() const {
137 pdfium::base::CheckedNumeric<int> w = right;
138 pdfium::base::CheckedNumeric<int> h = bottom;
139 w -= left;
140 h -= top;
141 return w.IsValid() && h.IsValid();
142 }
143
144 void Normalize();
145
146 void Intersect(const FX_RECT& src);
147 void Intersect(int l, int t, int r, int b) { Intersect(FX_RECT(l, t, r, b)); }
148
149 void Union(const FX_RECT& other_rect);
150 void Union(int l, int t, int r, int b) { Union(FX_RECT(l, t, r, b)); }
151
152 void Offset(int dx, int dy) {
153 left += dx;
154 right += dx;
155 top += dy;
156 bottom += dy;
157 }
158
159 bool operator==(const FX_RECT& src) const {
160 return left == src.left && right == src.right && top == src.top &&
161 bottom == src.bottom;
162 }
163
164 bool Contains(const FX_RECT& other_rect) const {
165 return other_rect.left >= left && other_rect.right <= right &&
166 other_rect.top >= top && other_rect.bottom <= bottom;
167 }
168
169 bool Contains(int x, int y) const {
170 return x >= left && x < right && y >= top && y < bottom;
171 }
172
173 int32_t left;
174 int32_t top;
175 int32_t right;
176 int32_t bottom;
177 };
178
179 // LBRT rectangles (y-axis runs upwards).
180 class CFX_FloatPoint {
181 public:
182 CFX_FloatPoint() : x(0.0f), y(0.0f) {}
183 CFX_FloatPoint(FX_FLOAT xx, FX_FLOAT yy) : x(xx), y(yy) {}
184
185 bool operator==(const CFX_FloatPoint& that) const {
186 return x == that.x && y == that.y;
187 }
188 bool operator!=(const CFX_FloatPoint& that) const { return !(*this == that); }
189
190 FX_FLOAT x;
191 FX_FLOAT y;
192 };
193
194 // LTWH rectangles (y-axis runs downwards).
195 template <class baseType>
196 class CFX_RTemplate {
197 public:
198 typedef CFX_PSTemplate<baseType> FXT_POINT;
199 typedef CFX_PSTemplate<baseType> FXT_SIZE;
200 typedef CFX_VTemplate<baseType> FXT_VECTOR;
201 typedef CFX_RTemplate<baseType> FXT_RECT;
202 void Set(baseType dst_left,
203 baseType dst_top,
204 baseType dst_width,
205 baseType dst_height) {
206 left = dst_left;
207 top = dst_top;
208 width = dst_width;
209 height = dst_height;
210 }
211 void Set(baseType dst_left, baseType dst_top, const FXT_SIZE& dst_size) {
212 left = dst_left;
213 top = dst_top;
214 Size(dst_size);
215 }
216 void Set(const FXT_POINT& p, baseType dst_width, baseType dst_height) {
217 TopLeft(p);
218 width = dst_width;
219 height = dst_height;
220 }
221 void Set(const FXT_POINT& p1, const FXT_POINT& p2) {
222 TopLeft(p1);
223 width = p2.x - p1.x;
224 height = p2.y - p1.y;
225 Normalize();
226 }
227 void Set(const FXT_POINT& p, const FXT_VECTOR& v) {
228 TopLeft(p);
229 width = v.x;
230 height = v.y;
231 Normalize();
232 }
233 void Reset() {
234 left = 0;
235 top = 0;
236 width = 0;
237 height = 0;
238 }
239 FXT_RECT& operator+=(const FXT_POINT& p) {
240 left += p.x;
241 top += p.y;
242 return *this;
243 }
244 FXT_RECT& operator-=(const FXT_POINT& p) {
245 left -= p.x;
246 top -= p.y;
247 return *this;
248 }
249 baseType right() const { return left + width; }
250 baseType bottom() const { return top + height; }
251 void Normalize() {
252 if (width < 0) {
253 left += width;
254 width = -width;
255 }
256 if (height < 0) {
257 top += height;
258 height = -height;
259 }
260 }
261 void Offset(baseType dx, baseType dy) {
262 left += dx;
263 top += dy;
264 }
265 void Inflate(baseType x, baseType y) {
266 left -= x;
267 width += x * 2;
268 top -= y;
269 height += y * 2;
270 }
271 void Inflate(const FXT_POINT& p) { Inflate(p.x, p.y); }
272 void Inflate(baseType off_left,
273 baseType off_top,
274 baseType off_right,
275 baseType off_bottom) {
276 left -= off_left;
277 top -= off_top;
278 width += off_left + off_right;
279 height += off_top + off_bottom;
280 }
281 void Inflate(const FXT_RECT& rt) {
282 Inflate(rt.left, rt.top, rt.left + rt.width, rt.top + rt.height);
283 }
284 void Deflate(baseType x, baseType y) {
285 left += x;
286 width -= x * 2;
287 top += y;
288 height -= y * 2;
289 }
290 void Deflate(const FXT_POINT& p) { Deflate(p.x, p.y); }
291 void Deflate(baseType off_left,
292 baseType off_top,
293 baseType off_right,
294 baseType off_bottom) {
295 left += off_left;
296 top += off_top;
297 width -= off_left + off_right;
298 height -= off_top + off_bottom;
299 }
300 void Deflate(const FXT_RECT& rt) {
301 Deflate(rt.left, rt.top, rt.top + rt.width, rt.top + rt.height);
302 }
303 FX_BOOL IsEmpty() const { return width <= 0 || height <= 0; }
304 FX_BOOL IsEmpty(FX_FLOAT fEpsilon) const {
305 return width <= fEpsilon || height <= fEpsilon;
306 }
307 void Empty() { width = height = 0; }
308 bool Contains(baseType x, baseType y) const {
309 return x >= left && x < left + width && y >= top && y < top + height;
310 }
311 bool Contains(const FXT_POINT& p) const { return Contains(p.x, p.y); }
312 bool Contains(const FXT_RECT& rt) const {
313 return rt.left >= left && rt.right() <= right() && rt.top >= top &&
314 rt.bottom() <= bottom();
315 }
316 baseType Width() const { return width; }
317 baseType Height() const { return height; }
318 FXT_SIZE Size() const {
319 FXT_SIZE size;
320 size.Set(width, height);
321 return size;
322 }
323 void Size(FXT_SIZE s) { width = s.x, height = s.y; }
324 FXT_POINT TopLeft() const {
325 FXT_POINT p;
326 p.x = left;
327 p.y = top;
328 return p;
329 }
330 FXT_POINT TopRight() const {
331 FXT_POINT p;
332 p.x = left + width;
333 p.y = top;
334 return p;
335 }
336 FXT_POINT BottomLeft() const {
337 FXT_POINT p;
338 p.x = left;
339 p.y = top + height;
340 return p;
341 }
342 FXT_POINT BottomRight() const {
343 FXT_POINT p;
344 p.x = left + width;
345 p.y = top + height;
346 return p;
347 }
348 void TopLeft(FXT_POINT tl) {
349 left = tl.x;
350 top = tl.y;
351 }
352 void TopRight(FXT_POINT tr) {
353 width = tr.x - left;
354 top = tr.y;
355 }
356 void BottomLeft(FXT_POINT bl) {
357 left = bl.x;
358 height = bl.y - top;
359 }
360 void BottomRight(FXT_POINT br) {
361 width = br.x - left;
362 height = br.y - top;
363 }
364 FXT_POINT Center() const {
365 FXT_POINT p;
366 p.x = left + width / 2;
367 p.y = top + height / 2;
368 return p;
369 }
370 void Union(baseType x, baseType y) {
371 baseType r = right();
372 baseType b = bottom();
373 if (left > x)
374 left = x;
375 if (r < x)
376 r = x;
377 if (top > y)
378 top = y;
379 if (b < y)
380 b = y;
381 width = r - left;
382 height = b - top;
383 }
384 void Union(const FXT_POINT& p) { Union(p.x, p.y); }
385 void Union(const FXT_RECT& rt) {
386 baseType r = right();
387 baseType b = bottom();
388 if (left > rt.left)
389 left = rt.left;
390 if (r < rt.right())
391 r = rt.right();
392 if (top > rt.top)
393 top = rt.top;
394 if (b < rt.bottom())
395 b = rt.bottom();
396 width = r - left;
397 height = b - top;
398 }
399 void Intersect(const FXT_RECT& rt) {
400 baseType r = right();
401 baseType b = bottom();
402 if (left < rt.left)
403 left = rt.left;
404 if (r > rt.right())
405 r = rt.right();
406 if (top < rt.top)
407 top = rt.top;
408 if (b > rt.bottom())
409 b = rt.bottom();
410 width = r - left;
411 height = b - top;
412 }
413 FX_BOOL IntersectWith(const FXT_RECT& rt) const {
414 FXT_RECT rect = rt;
415 rect.Intersect(*this);
416 return !rect.IsEmpty();
417 }
418 FX_BOOL IntersectWith(const FXT_RECT& rt, FX_FLOAT fEpsilon) const {
419 FXT_RECT rect = rt;
420 rect.Intersect(*this);
421 return !rect.IsEmpty(fEpsilon);
422 }
423 friend bool operator==(const FXT_RECT& rc1, const FXT_RECT& rc2) {
424 return rc1.left == rc2.left && rc1.top == rc2.top &&
425 rc1.width == rc2.width && rc1.height == rc2.height;
426 }
427 friend bool operator!=(const FXT_RECT& rc1, const FXT_RECT& rc2) {
428 return !(rc1 == rc2);
429 }
430 baseType left, top;
431 baseType width, height;
432 };
433 typedef CFX_RTemplate<int32_t> CFX_Rect;
434 typedef CFX_RTemplate<FX_FLOAT> CFX_RectF;
435 typedef CFX_ArrayTemplate<CFX_RectF> CFX_RectFArray;
436
437 class CFX_FloatRect {
438 public:
439 CFX_FloatRect() : CFX_FloatRect(0.0f, 0.0f, 0.0f, 0.0f) {}
440 CFX_FloatRect(FX_FLOAT l, FX_FLOAT b, FX_FLOAT r, FX_FLOAT t)
441 : left(l), bottom(b), right(r), top(t) {}
442
443 explicit CFX_FloatRect(const FX_FLOAT* pArray)
444 : CFX_FloatRect(pArray[0], pArray[1], pArray[2], pArray[3]) {}
445
446 explicit CFX_FloatRect(const FX_RECT& rect);
447
448 void Normalize();
449
450 void Reset() {
451 left = 0.0f;
452 right = 0.0f;
453 bottom = 0.0f;
454 top = 0.0f;
455 }
456
457 bool IsEmpty() const { return left >= right || bottom >= top; }
458 bool Contains(const CFX_FloatRect& other_rect) const;
459 bool Contains(FX_FLOAT x, FX_FLOAT y) const;
460
461 void Transform(const CFX_Matrix* pMatrix);
462 void Intersect(const CFX_FloatRect& other_rect);
463 void Union(const CFX_FloatRect& other_rect);
464
465 FX_RECT GetInnerRect() const;
466 FX_RECT GetOuterRect() const;
467 FX_RECT GetClosestRect() const;
468
469 int Substract4(CFX_FloatRect& substract_rect, CFX_FloatRect* pRects);
470
471 void InitRect(FX_FLOAT x, FX_FLOAT y) {
472 left = x;
473 right = x;
474 bottom = y;
475 top = y;
476 }
477 void UpdateRect(FX_FLOAT x, FX_FLOAT y);
478
479 FX_FLOAT Width() const { return right - left; }
480 FX_FLOAT Height() const { return top - bottom; }
481
482 void Inflate(FX_FLOAT x, FX_FLOAT y) {
483 Normalize();
484 left -= x;
485 right += x;
486 bottom -= y;
487 top += y;
488 }
489
490 void Inflate(FX_FLOAT other_left,
491 FX_FLOAT other_bottom,
492 FX_FLOAT other_right,
493 FX_FLOAT other_top) {
494 Normalize();
495 left -= other_left;
496 bottom -= other_bottom;
497 right += other_right;
498 top += other_top;
499 }
500
501 void Inflate(const CFX_FloatRect& rt) {
502 Inflate(rt.left, rt.bottom, rt.right, rt.top);
503 }
504
505 void Deflate(FX_FLOAT x, FX_FLOAT y) {
506 Normalize();
507 left += x;
508 right -= x;
509 bottom += y;
510 top -= y;
511 }
512
513 void Deflate(FX_FLOAT other_left,
514 FX_FLOAT other_bottom,
515 FX_FLOAT other_right,
516 FX_FLOAT other_top) {
517 Normalize();
518 left += other_left;
519 bottom += other_bottom;
520 right -= other_right;
521 top -= other_top;
522 }
523
524 void Deflate(const CFX_FloatRect& rt) {
525 Deflate(rt.left, rt.bottom, rt.right, rt.top);
526 }
527
528 void Translate(FX_FLOAT e, FX_FLOAT f) {
529 left += e;
530 right += e;
531 top += f;
532 bottom += f;
533 }
534
535 static CFX_FloatRect GetBBox(const CFX_PointF* pPoints, int nPoints);
536
537 FX_RECT ToFxRect() const {
538 return FX_RECT(static_cast<int32_t>(left), static_cast<int32_t>(top),
539 static_cast<int32_t>(right), static_cast<int32_t>(bottom));
540 }
541
542 static CFX_FloatRect FromCFXRectF(const CFX_RectF& rect) {
543 return CFX_FloatRect(rect.left, rect.top, rect.right(), rect.bottom());
544 }
545
546 FX_FLOAT left;
547 FX_FLOAT bottom;
548 FX_FLOAT right;
549 FX_FLOAT top;
550 };
551
552 class CFX_Matrix {
553 public:
554 CFX_Matrix() { SetIdentity(); }
555
556 CFX_Matrix(FX_FLOAT a1,
557 FX_FLOAT b1,
558 FX_FLOAT c1,
559 FX_FLOAT d1,
560 FX_FLOAT e1,
561 FX_FLOAT f1) {
562 a = a1;
563 b = b1;
564 c = c1;
565 d = d1;
566 e = e1;
567 f = f1;
568 }
569
570 void Set(FX_FLOAT a,
571 FX_FLOAT b,
572 FX_FLOAT c,
573 FX_FLOAT d,
574 FX_FLOAT e,
575 FX_FLOAT f);
576 void Set(const FX_FLOAT n[6]);
577
578 void SetIdentity() {
579 a = d = 1;
580 b = c = e = f = 0;
581 }
582
583 void SetReverse(const CFX_Matrix& m);
584
585 void Concat(FX_FLOAT a,
586 FX_FLOAT b,
587 FX_FLOAT c,
588 FX_FLOAT d,
589 FX_FLOAT e,
590 FX_FLOAT f,
591 FX_BOOL bPrepended = FALSE);
592 void Concat(const CFX_Matrix& m, FX_BOOL bPrepended = FALSE);
593 void ConcatInverse(const CFX_Matrix& m, FX_BOOL bPrepended = FALSE);
594
595 FX_BOOL IsIdentity() const {
596 return a == 1 && b == 0 && c == 0 && d == 1 && e == 0 && f == 0;
597 }
598
599 FX_BOOL IsInvertible() const;
600 FX_BOOL Is90Rotated() const;
601 FX_BOOL IsScaled() const;
602
603 void Translate(FX_FLOAT x, FX_FLOAT y, FX_BOOL bPrepended = FALSE);
604 void TranslateI(int32_t x, int32_t y, FX_BOOL bPrepended = FALSE) {
605 Translate((FX_FLOAT)x, (FX_FLOAT)y, bPrepended);
606 }
607
608 void Scale(FX_FLOAT sx, FX_FLOAT sy, FX_BOOL bPrepended = FALSE);
609 void Rotate(FX_FLOAT fRadian, FX_BOOL bPrepended = FALSE);
610 void RotateAt(FX_FLOAT fRadian,
611 FX_FLOAT x,
612 FX_FLOAT y,
613 FX_BOOL bPrepended = FALSE);
614
615 void Shear(FX_FLOAT fAlphaRadian,
616 FX_FLOAT fBetaRadian,
617 FX_BOOL bPrepended = FALSE);
618
619 void MatchRect(const CFX_FloatRect& dest, const CFX_FloatRect& src);
620 FX_FLOAT GetXUnit() const;
621 FX_FLOAT GetYUnit() const;
622 void GetUnitRect(CFX_RectF& rect) const;
623 CFX_FloatRect GetUnitRect() const;
624
625 FX_FLOAT GetUnitArea() const;
626 FX_FLOAT TransformXDistance(FX_FLOAT dx) const;
627 int32_t TransformXDistance(int32_t dx) const;
628 FX_FLOAT TransformYDistance(FX_FLOAT dy) const;
629 int32_t TransformYDistance(int32_t dy) const;
630 FX_FLOAT TransformDistance(FX_FLOAT dx, FX_FLOAT dy) const;
631 int32_t TransformDistance(int32_t dx, int32_t dy) const;
632 FX_FLOAT TransformDistance(FX_FLOAT distance) const;
633
634 void TransformPoint(FX_FLOAT& x, FX_FLOAT& y) const;
635 void TransformPoint(int32_t& x, int32_t& y) const;
636
637 void Transform(FX_FLOAT& x, FX_FLOAT& y) const { TransformPoint(x, y); }
638 void Transform(FX_FLOAT x, FX_FLOAT y, FX_FLOAT& x1, FX_FLOAT& y1) const {
639 x1 = x, y1 = y;
640 TransformPoint(x1, y1);
641 }
642
643 void TransformVector(CFX_VectorF& v) const;
644 void TransformVector(CFX_Vector& v) const;
645 void TransformRect(CFX_RectF& rect) const;
646 void TransformRect(CFX_Rect& rect) const;
647 void TransformRect(FX_FLOAT& left,
648 FX_FLOAT& right,
649 FX_FLOAT& top,
650 FX_FLOAT& bottom) const;
651 void TransformRect(CFX_FloatRect& rect) const {
652 TransformRect(rect.left, rect.right, rect.top, rect.bottom);
653 }
654
655 FX_FLOAT GetA() const { return a; }
656 FX_FLOAT GetB() const { return b; }
657 FX_FLOAT GetC() const { return c; }
658 FX_FLOAT GetD() const { return d; }
659 FX_FLOAT GetE() const { return e; }
660 FX_FLOAT GetF() const { return f; }
661
662 public:
663 FX_FLOAT a;
664 FX_FLOAT b;
665 FX_FLOAT c;
666 FX_FLOAT d;
667 FX_FLOAT e;
668 FX_FLOAT f;
669 };
670
671 #endif // CORE_FXCRT_INCLUDE_FX_COORDINATES_H_
OLDNEW
« no previous file with comments | « core/fxcrt/include/fx_basic.h ('k') | core/fxcrt/include/fx_ext.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698