OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <windows.h> | 5 #include <windows.h> |
6 | 6 |
7 #include "skia/ext/vector_platform_device_win.h" | 7 #include "skia/ext/vector_platform_device_win.h" |
8 | 8 |
9 #include "base/gfx/gdi_util.h" | |
10 #include "skia/ext/skia_utils_win.h" | 9 #include "skia/ext/skia_utils_win.h" |
11 #include "third_party/skia/include/core/SkUtils.h" | 10 #include "third_party/skia/include/core/SkUtils.h" |
12 | 11 |
13 namespace skia { | 12 namespace skia { |
14 | 13 |
| 14 static void FillBitmapInfoHeader(int width, int height, BITMAPINFOHEADER* hdr) { |
| 15 hdr->biSize = sizeof(BITMAPINFOHEADER); |
| 16 hdr->biWidth = width; |
| 17 hdr->biHeight = -height; // Minus means top-down bitmap. |
| 18 hdr->biPlanes = 1; |
| 19 hdr->biBitCount = 32; |
| 20 hdr->biCompression = BI_RGB; // no compression |
| 21 hdr->biSizeImage = 0; |
| 22 hdr->biXPelsPerMeter = 1; |
| 23 hdr->biYPelsPerMeter = 1; |
| 24 hdr->biClrUsed = 0; |
| 25 hdr->biClrImportant = 0; |
| 26 } |
| 27 |
15 VectorPlatformDevice* VectorPlatformDevice::create(HDC dc, | 28 VectorPlatformDevice* VectorPlatformDevice::create(HDC dc, |
16 int width, int height) { | 29 int width, int height) { |
17 InitializeDC(dc); | 30 InitializeDC(dc); |
18 | 31 |
19 // Link the SkBitmap to the current selected bitmap in the device context. | 32 // Link the SkBitmap to the current selected bitmap in the device context. |
20 SkBitmap bitmap; | 33 SkBitmap bitmap; |
21 HGDIOBJ selected_bitmap = GetCurrentObject(dc, OBJ_BITMAP); | 34 HGDIOBJ selected_bitmap = GetCurrentObject(dc, OBJ_BITMAP); |
22 bool succeeded = false; | 35 bool succeeded = false; |
23 if (selected_bitmap != NULL) { | 36 if (selected_bitmap != NULL) { |
24 BITMAP bitmap_data; | 37 BITMAP bitmap_data; |
(...skipping 530 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
555 } else { | 568 } else { |
556 if (!ApplyPaint(paint)) | 569 if (!ApplyPaint(paint)) |
557 return; | 570 return; |
558 is_translucent = false; | 571 is_translucent = false; |
559 } | 572 } |
560 int src_size_x = bitmap.width(); | 573 int src_size_x = bitmap.width(); |
561 int src_size_y = bitmap.height(); | 574 int src_size_y = bitmap.height(); |
562 if (!src_size_x || !src_size_y) | 575 if (!src_size_x || !src_size_y) |
563 return; | 576 return; |
564 | 577 |
565 // Create a BMP v4 header that we can serialize. | 578 // Create a BMP v4 header that we can serialize. We use the shared "V3" |
| 579 // fillter to fill the stardard items, then add in the "V4" stuff we want. |
566 BITMAPV4HEADER bitmap_header; | 580 BITMAPV4HEADER bitmap_header; |
567 gfx::CreateBitmapV4Header(src_size_x, src_size_y, &bitmap_header); | 581 memset(&bitmap_header, 0, sizeof(BITMAPV4HEADER)); |
| 582 FillBitmapInfoHeader(src_size_x, src_size_y, |
| 583 reinterpret_cast<BITMAPINFOHEADER*>(&bitmap_header)); |
| 584 bitmap_header.bV4Size = sizeof(BITMAPV4HEADER); |
| 585 bitmap_header.bV4RedMask = 0x00ff0000; |
| 586 bitmap_header.bV4GreenMask = 0x0000ff00; |
| 587 bitmap_header.bV4BlueMask = 0x000000ff; |
| 588 bitmap_header.bV4AlphaMask = 0xff000000; |
| 589 |
568 HDC dc = getBitmapDC(); | 590 HDC dc = getBitmapDC(); |
569 SkAutoLockPixels lock(bitmap); | 591 SkAutoLockPixels lock(bitmap); |
570 SkASSERT(bitmap.getConfig() == SkBitmap::kARGB_8888_Config); | 592 SkASSERT(bitmap.getConfig() == SkBitmap::kARGB_8888_Config); |
571 const uint32_t* pixels = static_cast<const uint32_t*>(bitmap.getPixels()); | 593 const uint32_t* pixels = static_cast<const uint32_t*>(bitmap.getPixels()); |
572 if (pixels == NULL) { | 594 if (pixels == NULL) { |
573 SkASSERT(false); | 595 SkASSERT(false); |
574 return; | 596 return; |
575 } | 597 } |
576 | 598 |
577 if (!is_translucent) { | 599 if (!is_translucent) { |
578 int row_length = bitmap.rowBytesAsPixels(); | 600 int row_length = bitmap.rowBytesAsPixels(); |
579 // There is no quick way to determine if an image is opaque. | 601 // There is no quick way to determine if an image is opaque. |
580 for (int y2 = 0; y2 < src_size_y; ++y2) { | 602 for (int y2 = 0; y2 < src_size_y; ++y2) { |
581 for (int x2 = 0; x2 < src_size_x; ++x2) { | 603 for (int x2 = 0; x2 < src_size_x; ++x2) { |
582 if (SkColorGetA(pixels[(y2 * row_length) + x2]) != 255) { | 604 if (SkColorGetA(pixels[(y2 * row_length) + x2]) != 255) { |
583 is_translucent = true; | 605 is_translucent = true; |
584 y2 = src_size_y; | 606 y2 = src_size_y; |
585 break; | 607 break; |
586 } | 608 } |
587 } | 609 } |
588 } | 610 } |
589 } | 611 } |
590 | 612 |
591 BITMAPINFOHEADER hdr; | 613 BITMAPINFOHEADER hdr; |
592 gfx::CreateBitmapHeader(src_size_x, src_size_y, &hdr); | 614 FillBitmapInfoHeader(src_size_x, src_size_y, &hdr); |
593 if (is_translucent) { | 615 if (is_translucent) { |
594 // The image must be loaded as a bitmap inside a device context. | 616 // The image must be loaded as a bitmap inside a device context. |
595 HDC bitmap_dc = ::CreateCompatibleDC(dc); | 617 HDC bitmap_dc = ::CreateCompatibleDC(dc); |
596 void* bits = NULL; | 618 void* bits = NULL; |
597 HBITMAP hbitmap = ::CreateDIBSection( | 619 HBITMAP hbitmap = ::CreateDIBSection( |
598 bitmap_dc, reinterpret_cast<const BITMAPINFO*>(&hdr), | 620 bitmap_dc, reinterpret_cast<const BITMAPINFO*>(&hdr), |
599 DIB_RGB_COLORS, &bits, NULL, 0); | 621 DIB_RGB_COLORS, &bits, NULL, 0); |
600 memcpy(bits, pixels, bitmap.getSize()); | 622 memcpy(bits, pixels, bitmap.getSize()); |
601 SkASSERT(hbitmap); | 623 SkASSERT(hbitmap); |
602 HGDIOBJ old_bitmap = ::SelectObject(bitmap_dc, hbitmap); | 624 HGDIOBJ old_bitmap = ::SelectObject(bitmap_dc, hbitmap); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
636 reinterpret_cast<const BITMAPINFO*>(&hdr), | 658 reinterpret_cast<const BITMAPINFO*>(&hdr), |
637 DIB_RGB_COLORS, | 659 DIB_RGB_COLORS, |
638 SRCCOPY); | 660 SRCCOPY); |
639 SkASSERT(result); | 661 SkASSERT(result); |
640 } | 662 } |
641 Cleanup(); | 663 Cleanup(); |
642 } | 664 } |
643 | 665 |
644 } // namespace skia | 666 } // namespace skia |
645 | 667 |
OLD | NEW |