| Index: skia/ext/platform_device_win.cc
|
| diff --git a/skia/ext/platform_device_win.cc b/skia/ext/platform_device_win.cc
|
| deleted file mode 100644
|
| index ef48fbd3a38cf2ceb5a854cbeb2fe9562eb28f17..0000000000000000000000000000000000000000
|
| --- a/skia/ext/platform_device_win.cc
|
| +++ /dev/null
|
| @@ -1,233 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "skia/ext/platform_device.h"
|
| -
|
| -#include "skia/ext/skia_utils_win.h"
|
| -#include "third_party/skia/include/core/SkMatrix.h"
|
| -#include "third_party/skia/include/core/SkPath.h"
|
| -#include "third_party/skia/include/core/SkRegion.h"
|
| -#include "third_party/skia/include/core/SkUtils.h"
|
| -
|
| -namespace skia {
|
| -
|
| -void InitializeDC(HDC context) {
|
| - // Enables world transformation.
|
| - // If the GM_ADVANCED graphics mode is set, GDI always draws arcs in the
|
| - // counterclockwise direction in logical space. This is equivalent to the
|
| - // statement that, in the GM_ADVANCED graphics mode, both arc control points
|
| - // and arcs themselves fully respect the device context's world-to-device
|
| - // transformation.
|
| - BOOL res = SetGraphicsMode(context, GM_ADVANCED);
|
| - SkASSERT(res != 0);
|
| -
|
| - // Enables dithering.
|
| - res = SetStretchBltMode(context, HALFTONE);
|
| - SkASSERT(res != 0);
|
| - // As per SetStretchBltMode() documentation, SetBrushOrgEx() must be called
|
| - // right after.
|
| - res = SetBrushOrgEx(context, 0, 0, NULL);
|
| - SkASSERT(res != 0);
|
| -
|
| - // Sets up default orientation.
|
| - res = SetArcDirection(context, AD_CLOCKWISE);
|
| - SkASSERT(res != 0);
|
| -
|
| - // Sets up default colors.
|
| - res = SetBkColor(context, RGB(255, 255, 255));
|
| - SkASSERT(res != CLR_INVALID);
|
| - res = SetTextColor(context, RGB(0, 0, 0));
|
| - SkASSERT(res != CLR_INVALID);
|
| - res = SetDCBrushColor(context, RGB(255, 255, 255));
|
| - SkASSERT(res != CLR_INVALID);
|
| - res = SetDCPenColor(context, RGB(0, 0, 0));
|
| - SkASSERT(res != CLR_INVALID);
|
| -
|
| - // Sets up default transparency.
|
| - res = SetBkMode(context, OPAQUE);
|
| - SkASSERT(res != 0);
|
| - res = SetROP2(context, R2_COPYPEN);
|
| - SkASSERT(res != 0);
|
| -}
|
| -
|
| -PlatformSurface PlatformDevice::BeginPlatformPaint() {
|
| - return 0;
|
| -}
|
| -
|
| -void PlatformDevice::EndPlatformPaint() {
|
| - // We don't clear the DC here since it will be likely to be used again.
|
| - // Flushing will be done in onAccessBitmap.
|
| -}
|
| -
|
| -// static
|
| -bool PlatformDevice::LoadPathToDC(HDC context, const SkPath& path) {
|
| - switch (path.getFillType()) {
|
| - case SkPath::kWinding_FillType: {
|
| - int res = SetPolyFillMode(context, WINDING);
|
| - SkASSERT(res != 0);
|
| - break;
|
| - }
|
| - case SkPath::kEvenOdd_FillType: {
|
| - int res = SetPolyFillMode(context, ALTERNATE);
|
| - SkASSERT(res != 0);
|
| - break;
|
| - }
|
| - default: {
|
| - SkASSERT(false);
|
| - break;
|
| - }
|
| - }
|
| - BOOL res = BeginPath(context);
|
| - if (!res) {
|
| - return false;
|
| - }
|
| -
|
| - CubicPaths paths;
|
| - if (!SkPathToCubicPaths(&paths, path))
|
| - return false;
|
| -
|
| - std::vector<POINT> points;
|
| - for (CubicPaths::const_iterator path(paths.begin()); path != paths.end();
|
| - ++path) {
|
| - if (!path->size())
|
| - continue;
|
| - points.resize(0);
|
| - points.reserve(path->size() * 3 / 4 + 1);
|
| - points.push_back(SkPointToPOINT(path->front().p[0]));
|
| - for (CubicPath::const_iterator point(path->begin()); point != path->end();
|
| - ++point) {
|
| - // Never add point->p[0]
|
| - points.push_back(SkPointToPOINT(point->p[1]));
|
| - points.push_back(SkPointToPOINT(point->p[2]));
|
| - points.push_back(SkPointToPOINT(point->p[3]));
|
| - }
|
| - SkASSERT((points.size() - 1) % 3 == 0);
|
| - // This is slightly inefficient since all straight line and quadratic lines
|
| - // are "upgraded" to a cubic line.
|
| - // TODO(maruel): http://b/1147346 We should use
|
| - // PolyDraw/PolyBezier/Polyline whenever possible.
|
| - res = PolyBezier(context, &points.front(),
|
| - static_cast<DWORD>(points.size()));
|
| - SkASSERT(res != 0);
|
| - if (res == 0)
|
| - break;
|
| - }
|
| - if (res == 0) {
|
| - // Make sure the path is discarded.
|
| - AbortPath(context);
|
| - } else {
|
| - res = EndPath(context);
|
| - SkASSERT(res != 0);
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -// static
|
| -void PlatformDevice::LoadTransformToDC(HDC dc, const SkMatrix& matrix) {
|
| - XFORM xf;
|
| - xf.eM11 = matrix[SkMatrix::kMScaleX];
|
| - xf.eM21 = matrix[SkMatrix::kMSkewX];
|
| - xf.eDx = matrix[SkMatrix::kMTransX];
|
| - xf.eM12 = matrix[SkMatrix::kMSkewY];
|
| - xf.eM22 = matrix[SkMatrix::kMScaleY];
|
| - xf.eDy = matrix[SkMatrix::kMTransY];
|
| - SetWorldTransform(dc, &xf);
|
| -}
|
| -
|
| -// static
|
| -bool PlatformDevice::SkPathToCubicPaths(CubicPaths* paths,
|
| - const SkPath& skpath) {
|
| - paths->clear();
|
| - CubicPath* current_path = NULL;
|
| - SkPoint current_points[4];
|
| - CubicPoints points_to_add;
|
| - SkPath::Iter iter(skpath, false);
|
| - for (SkPath::Verb verb = iter.next(current_points);
|
| - verb != SkPath::kDone_Verb;
|
| - verb = iter.next(current_points)) {
|
| - switch (verb) {
|
| - case SkPath::kMove_Verb: { // iter.next returns 1 point
|
| - // Ignores it since the point is copied in the next operation. See
|
| - // SkPath::Iter::next() for reference.
|
| - paths->push_back(CubicPath());
|
| - current_path = &paths->back();
|
| - // Skip point addition.
|
| - continue;
|
| - }
|
| - case SkPath::kLine_Verb: { // iter.next returns 2 points
|
| - points_to_add.p[0] = current_points[0];
|
| - points_to_add.p[1] = current_points[0];
|
| - points_to_add.p[2] = current_points[1];
|
| - points_to_add.p[3] = current_points[1];
|
| - break;
|
| - }
|
| - case SkPath::kQuad_Verb: { // iter.next returns 3 points
|
| - points_to_add.p[0] = current_points[0];
|
| - points_to_add.p[1] = current_points[1];
|
| - points_to_add.p[2] = current_points[2];
|
| - points_to_add.p[3] = current_points[2];
|
| - break;
|
| - }
|
| - case SkPath::kCubic_Verb: { // iter.next returns 4 points
|
| - points_to_add.p[0] = current_points[0];
|
| - points_to_add.p[1] = current_points[1];
|
| - points_to_add.p[2] = current_points[2];
|
| - points_to_add.p[3] = current_points[3];
|
| - break;
|
| - }
|
| - case SkPath::kClose_Verb: { // iter.next returns 1 point (the last point)
|
| - paths->push_back(CubicPath());
|
| - current_path = &paths->back();
|
| - continue;
|
| - }
|
| - default: {
|
| - current_path = NULL;
|
| - // Will return false.
|
| - break;
|
| - }
|
| - }
|
| - SkASSERT(current_path);
|
| - if (!current_path) {
|
| - paths->clear();
|
| - return false;
|
| - }
|
| - current_path->push_back(points_to_add);
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -// static
|
| -void PlatformDevice::LoadClippingRegionToDC(HDC context,
|
| - const SkRegion& region,
|
| - const SkMatrix& transformation) {
|
| - HRGN hrgn;
|
| - if (region.isEmpty()) {
|
| - // region can be empty, in which case everything will be clipped.
|
| - hrgn = CreateRectRgn(0, 0, 0, 0);
|
| - } else if (region.isRect()) {
|
| - // We don't apply transformation, because the translation is already applied
|
| - // to the region.
|
| - hrgn = CreateRectRgnIndirect(&SkIRectToRECT(region.getBounds()));
|
| - } else {
|
| - // It is complex.
|
| - SkPath path;
|
| - region.getBoundaryPath(&path);
|
| - // Clip. Note that windows clipping regions are not affected by the
|
| - // transform so apply it manually.
|
| - // Since the transform is given as the original translation of canvas, we
|
| - // should apply it in reverse.
|
| - SkMatrix t(transformation);
|
| - t.setTranslateX(-t.getTranslateX());
|
| - t.setTranslateY(-t.getTranslateY());
|
| - path.transform(t);
|
| - LoadPathToDC(context, path);
|
| - hrgn = PathToRegion(context);
|
| - }
|
| - int result = SelectClipRgn(context, hrgn);
|
| - SkASSERT(result != ERROR);
|
| - result = DeleteObject(hrgn);
|
| - SkASSERT(result != 0);
|
| -}
|
| -
|
| -} // namespace skia
|
|
|