| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2011 The Chromium 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 #ifndef SKIA_EXT_VECTOR_PLATFORM_DEVICE_EMF_WIN_H_ | |
| 6 #define SKIA_EXT_VECTOR_PLATFORM_DEVICE_EMF_WIN_H_ | |
| 7 | |
| 8 #include "base/basictypes.h" | |
| 9 #include "base/compiler_specific.h" | |
| 10 #include "skia/ext/platform_device.h" | |
| 11 #include "third_party/skia/include/core/SkMatrix.h" | |
| 12 #include "third_party/skia/include/core/SkRegion.h" | |
| 13 | |
| 14 namespace skia { | |
| 15 | |
| 16 // A device is basically a wrapper around SkBitmap that provides a surface for | |
| 17 // SkCanvas to draw into. This specific device is not not backed by a surface | |
| 18 // and is thus unreadable. This is because the backend is completely vectorial. | |
| 19 // This device is a simple wrapper over a Windows device context (HDC) handle. | |
| 20 // TODO(robertphillips): Once Skia's SkBaseDevice is refactored to remove | |
| 21 // the bitmap-specific entry points, this class should derive from it. | |
| 22 class VectorPlatformDeviceEmf : public SkBitmapDevice, public PlatformDevice { | |
| 23 public: | |
| 24 SK_API static SkBaseDevice* CreateDevice(int width, int height, bool isOpaque, | |
| 25 HANDLE shared_section); | |
| 26 | |
| 27 // Factory function. The DC is kept as the output context. | |
| 28 static SkBaseDevice* create(HDC dc, int width, int height); | |
| 29 | |
| 30 VectorPlatformDeviceEmf(HDC dc, const SkBitmap& bitmap); | |
| 31 virtual ~VectorPlatformDeviceEmf(); | |
| 32 | |
| 33 // PlatformDevice methods | |
| 34 virtual PlatformSurface BeginPlatformPaint() override; | |
| 35 | |
| 36 // SkBaseDevice methods. | |
| 37 virtual void drawPaint(const SkDraw& draw, const SkPaint& paint) override; | |
| 38 virtual void drawPoints(const SkDraw& draw, SkCanvas::PointMode mode, | |
| 39 size_t count, const SkPoint[], | |
| 40 const SkPaint& paint) override; | |
| 41 virtual void drawRect(const SkDraw& draw, const SkRect& r, | |
| 42 const SkPaint& paint) override; | |
| 43 virtual void drawRRect(const SkDraw&, const SkRRect& rr, | |
| 44 const SkPaint& paint) override; | |
| 45 virtual void drawPath(const SkDraw& draw, const SkPath& path, | |
| 46 const SkPaint& paint, | |
| 47 const SkMatrix* prePathMatrix = NULL, | |
| 48 bool pathIsMutable = false) override; | |
| 49 virtual void drawBitmapRect(const SkDraw& draw, const SkBitmap& bitmap, | |
| 50 const SkRect* src, const SkRect& dst, | |
| 51 const SkPaint& paint, | |
| 52 SkCanvas::DrawBitmapRectFlags flags) override; | |
| 53 virtual void drawBitmap(const SkDraw& draw, const SkBitmap& bitmap, | |
| 54 const SkMatrix& matrix, | |
| 55 const SkPaint& paint) override; | |
| 56 virtual void drawSprite(const SkDraw& draw, const SkBitmap& bitmap, | |
| 57 int x, int y, const SkPaint& paint) override; | |
| 58 virtual void drawText(const SkDraw& draw, const void* text, size_t len, | |
| 59 SkScalar x, SkScalar y, const SkPaint& paint) override; | |
| 60 virtual void drawPosText(const SkDraw& draw, const void* text, size_t len, | |
| 61 const SkScalar pos[], int scalarsPerPos, | |
| 62 const SkPoint& offset, const SkPaint& paint) override
; | |
| 63 virtual void drawTextOnPath(const SkDraw& draw, const void* text, size_t len, | |
| 64 const SkPath& path, const SkMatrix* matrix, | |
| 65 const SkPaint& paint) override; | |
| 66 virtual void drawVertices(const SkDraw& draw, SkCanvas::VertexMode, | |
| 67 int vertexCount, | |
| 68 const SkPoint verts[], const SkPoint texs[], | |
| 69 const SkColor colors[], SkXfermode* xmode, | |
| 70 const uint16_t indices[], int indexCount, | |
| 71 const SkPaint& paint) override; | |
| 72 virtual void drawDevice(const SkDraw& draw, SkBaseDevice*, int x, int y, | |
| 73 const SkPaint&) override; | |
| 74 | |
| 75 virtual void setMatrixClip(const SkMatrix& transform, const SkRegion& region, | |
| 76 const SkClipStack&) override; | |
| 77 | |
| 78 void LoadClipRegion(); | |
| 79 | |
| 80 protected: | |
| 81 virtual SkBaseDevice* onCreateCompatibleDevice(const CreateInfo& info) overrid
e; | |
| 82 | |
| 83 private: | |
| 84 // Applies the SkPaint's painting properties in the current GDI context, if | |
| 85 // possible. If GDI can't support all paint's properties, returns false. It | |
| 86 // doesn't execute the "commands" in SkPaint. | |
| 87 bool ApplyPaint(const SkPaint& paint); | |
| 88 | |
| 89 // Selects a new object in the device context. It can be a pen, a brush, a | |
| 90 // clipping region, a bitmap or a font. Returns the old selected object. | |
| 91 HGDIOBJ SelectObject(HGDIOBJ object); | |
| 92 | |
| 93 // Creates a brush according to SkPaint's properties. | |
| 94 bool CreateBrush(bool use_brush, const SkPaint& paint); | |
| 95 | |
| 96 // Creates a pen according to SkPaint's properties. | |
| 97 bool CreatePen(bool use_pen, const SkPaint& paint); | |
| 98 | |
| 99 // Restores back the previous objects (pen, brush, etc) after a paint command. | |
| 100 void Cleanup(); | |
| 101 | |
| 102 // Creates a brush according to SkPaint's properties. | |
| 103 bool CreateBrush(bool use_brush, COLORREF color); | |
| 104 | |
| 105 // Creates a pen according to SkPaint's properties. | |
| 106 bool CreatePen(bool use_pen, COLORREF color, int stroke_width, | |
| 107 float stroke_miter, DWORD pen_style); | |
| 108 | |
| 109 // Draws a bitmap in the the device, using the currently loaded matrix. | |
| 110 void InternalDrawBitmap(const SkBitmap& bitmap, int x, int y, | |
| 111 const SkPaint& paint); | |
| 112 | |
| 113 // The Windows Device Context handle. It is the backend used with GDI drawing. | |
| 114 // This backend is write-only and vectorial. | |
| 115 HDC hdc_; | |
| 116 | |
| 117 // Translation assigned to the DC: we need to keep track of this separately | |
| 118 // so it can be updated even if the DC isn't created yet. | |
| 119 SkMatrix transform_; | |
| 120 | |
| 121 // The current clipping | |
| 122 SkRegion clip_region_; | |
| 123 | |
| 124 // Previously selected brush before the current drawing. | |
| 125 HGDIOBJ previous_brush_; | |
| 126 | |
| 127 // Previously selected pen before the current drawing. | |
| 128 HGDIOBJ previous_pen_; | |
| 129 | |
| 130 DISALLOW_COPY_AND_ASSIGN(VectorPlatformDeviceEmf); | |
| 131 }; | |
| 132 | |
| 133 typedef void (*SkiaEnsureTypefaceCharactersAccessible) | |
| 134 (const LOGFONT& font, const wchar_t* text, unsigned int text_length); | |
| 135 | |
| 136 SK_API void SetSkiaEnsureTypefaceCharactersAccessible( | |
| 137 SkiaEnsureTypefaceCharactersAccessible func); | |
| 138 | |
| 139 } // namespace skia | |
| 140 | |
| 141 #endif // SKIA_EXT_VECTOR_PLATFORM_DEVICE_EMF_WIN_H_ | |
| OLD | NEW |