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

Side by Side Diff: src/core/SkBitmap.cpp

Issue 22350003: Add downsample from 8888 to 4444. (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 years, 4 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 | « no previous file | 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
1 1
2 /* 2 /*
3 * Copyright 2008 The Android Open Source Project 3 * Copyright 2008 The Android Open Source Project
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 9
10 #include "SkBitmap.h" 10 #include "SkBitmap.h"
(...skipping 999 matching lines...) Expand 10 before | Expand all | Expand 10 after
1010 } 1010 }
1011 1011
1012 bool sameConfigs = (this->config() == dstConfig); 1012 bool sameConfigs = (this->config() == dstConfig);
1013 switch (dstConfig) { 1013 switch (dstConfig) {
1014 case kA8_Config: 1014 case kA8_Config:
1015 case kRGB_565_Config: 1015 case kRGB_565_Config:
1016 case kARGB_8888_Config: 1016 case kARGB_8888_Config:
1017 break; 1017 break;
1018 case kA1_Config: 1018 case kA1_Config:
1019 case kIndex8_Config: 1019 case kIndex8_Config:
1020 case kARGB_4444_Config:
1021 if (!sameConfigs) { 1020 if (!sameConfigs) {
1022 return false; 1021 return false;
1023 } 1022 }
1024 break; 1023 break;
1024 case kARGB_4444_Config:
1025 return sameConfigs || kARGB_8888_Config == this->config();
1025 default: 1026 default:
1026 return false; 1027 return false;
1027 } 1028 }
1028 1029
1029 // do not copy src if srcConfig == kA1_Config while dstConfig != kA1_Config 1030 // do not copy src if srcConfig == kA1_Config while dstConfig != kA1_Config
1030 if (this->getConfig() == kA1_Config && !sameConfigs) { 1031 if (this->getConfig() == kA1_Config && !sameConfigs) {
1031 return false; 1032 return false;
1032 } 1033 }
1033 1034
1034 return true; 1035 return true;
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
1102 const char* srcP = reinterpret_cast<const char*>(src->getPixels()); 1103 const char* srcP = reinterpret_cast<const char*>(src->getPixels());
1103 char* dstP = reinterpret_cast<char*>(tmpDst.getPixels()); 1104 char* dstP = reinterpret_cast<char*>(tmpDst.getPixels());
1104 // to be sure we don't read too much, only copy our logical pixels 1105 // to be sure we don't read too much, only copy our logical pixels
1105 size_t bytesToCopy = tmpDst.width() * tmpDst.bytesPerPixel(); 1106 size_t bytesToCopy = tmpDst.width() * tmpDst.bytesPerPixel();
1106 for (int y = 0; y < tmpDst.height(); y++) { 1107 for (int y = 0; y < tmpDst.height(); y++) {
1107 memcpy(dstP, srcP, bytesToCopy); 1108 memcpy(dstP, srcP, bytesToCopy);
1108 srcP += src->rowBytes(); 1109 srcP += src->rowBytes();
1109 dstP += tmpDst.rowBytes(); 1110 dstP += tmpDst.rowBytes();
1110 } 1111 }
1111 } 1112 }
1113 } else if (SkBitmap::kARGB_4444_Config == dstConfig
1114 && SkBitmap::kARGB_8888_Config == src->config()) {
1115 SkASSERT(src->height() == tmpDst.height());
1116 SkASSERT(src->width() == tmpDst.width());
1117 for (int y = 0; y < src->height(); ++y) {
1118 SkPMColor16* SK_RESTRICT dstRow = (SkPMColor16*) tmpDst.getAddr16(0, y);
1119 SkPMColor* SK_RESTRICT srcRow = (SkPMColor*) src->getAddr32(0, y);
1120 DITHER_4444_SCAN(y);
1121 for (int x = 0; x < src->width(); ++x) {
1122 SkColor c = SkUnPreMultiply::PMColorToColor(srcRow[x]);
reed1 2013/08/07 18:30:03 Why the unpremultiply step? I think you can call t
scroggo 2013/08/07 19:04:19 Overlooked that one. New patch calls the version t
1123 dstRow[x] = SkDitherARGB32To4444(SkColorGetA(c), SkColorGetR(c),
1124 SkColorGetG(c), SkColorGetB(c),
1125 DITHER_VALUE(x));
1126 }
1127 }
1112 } else { 1128 } else {
1113 // if the src has alpha, we have to clear the dst first 1129 // if the src has alpha, we have to clear the dst first
1114 if (!src->isOpaque()) { 1130 if (!src->isOpaque()) {
1115 tmpDst.eraseColor(SK_ColorTRANSPARENT); 1131 tmpDst.eraseColor(SK_ColorTRANSPARENT);
1116 } 1132 }
1117 1133
1118 SkCanvas canvas(tmpDst); 1134 SkCanvas canvas(tmpDst);
1119 SkPaint paint; 1135 SkPaint paint;
1120 1136
1121 paint.setDither(true); 1137 paint.setDither(true);
(...skipping 564 matching lines...) Expand 10 before | Expand all | Expand 10 after
1686 if (NULL != uri) { 1702 if (NULL != uri) {
1687 str->appendf(" uri:\"%s\"", uri); 1703 str->appendf(" uri:\"%s\"", uri);
1688 } else { 1704 } else {
1689 str->appendf(" pixelref:%p", pr); 1705 str->appendf(" pixelref:%p", pr);
1690 } 1706 }
1691 } 1707 }
1692 1708
1693 str->append(")"); 1709 str->append(")");
1694 } 1710 }
1695 #endif 1711 #endif
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698