mirror of
https://github.com/aseprite/aseprite.git
synced 2024-12-25 15:18:23 +00:00
Change memset/memcpy with std::fill/copy in ImageImpl
This commit is contained in:
parent
01e8e99fcb
commit
dc1bc964ce
@ -1,5 +1,5 @@
|
|||||||
// Aseprite Document Library
|
// Aseprite Document Library
|
||||||
// Copyright (c) 2001-2015 David Capello
|
// Copyright (c) 2001-2016 David Capello
|
||||||
//
|
//
|
||||||
// This file is released under the terms of the MIT license.
|
// This file is released under the terms of the MIT license.
|
||||||
// Read LICENSE.txt for more information.
|
// Read LICENSE.txt for more information.
|
||||||
@ -8,6 +8,7 @@
|
|||||||
#define DOC_IMAGE_IMPL_H_INCLUDED
|
#define DOC_IMAGE_IMPL_H_INCLUDED
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
@ -100,33 +101,35 @@ namespace doc {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void clear(color_t color) override {
|
void clear(color_t color) override {
|
||||||
LockImageBits<Traits> bits(this);
|
int w = width();
|
||||||
typename LockImageBits<Traits>::iterator it(bits.begin());
|
int h = height();
|
||||||
typename LockImageBits<Traits>::iterator end(bits.end());
|
|
||||||
|
|
||||||
for (; it != end; ++it)
|
// Fill the first line
|
||||||
*it = color;
|
address_t first = address(0, 0);
|
||||||
|
std::fill(first, first+w, color);
|
||||||
|
|
||||||
|
// Copy the first line into all other lines
|
||||||
|
for (int y=1; y<h; ++y)
|
||||||
|
std::copy(first, first+w, address(0, y));
|
||||||
}
|
}
|
||||||
|
|
||||||
void copy(const Image* _src, gfx::Clip area) override {
|
void copy(const Image* _src, gfx::Clip area) override {
|
||||||
const ImageImpl<Traits>* src = (const ImageImpl<Traits>*)_src;
|
const ImageImpl<Traits>* src = (const ImageImpl<Traits>*)_src;
|
||||||
address_t src_address;
|
address_t src_address;
|
||||||
address_t dst_address;
|
address_t dst_address;
|
||||||
int bytes;
|
|
||||||
|
|
||||||
if (!area.clip(width(), height(), src->width(), src->height()))
|
if (!area.clip(width(), height(), src->width(), src->height()))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Copy process
|
|
||||||
bytes = Traits::getRowStrideBytes(area.size.w);
|
|
||||||
|
|
||||||
for (int end_y=area.dst.y+area.size.h;
|
for (int end_y=area.dst.y+area.size.h;
|
||||||
area.dst.y<end_y;
|
area.dst.y<end_y;
|
||||||
++area.dst.y, ++area.src.y) {
|
++area.dst.y, ++area.src.y) {
|
||||||
src_address = src->address(area.src.x, area.src.y);
|
src_address = src->address(area.src.x, area.src.y);
|
||||||
dst_address = address(area.dst.x, area.dst.y);
|
dst_address = address(area.dst.x, area.dst.y);
|
||||||
|
|
||||||
std::memcpy(dst_address, src_address, bytes);
|
std::copy(src_address,
|
||||||
|
src_address + area.size.w,
|
||||||
|
dst_address);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -140,8 +143,14 @@ namespace doc {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void fillRect(int x1, int y1, int x2, int y2, color_t color) override {
|
void fillRect(int x1, int y1, int x2, int y2, color_t color) override {
|
||||||
|
// Fill the first line
|
||||||
|
ImageImpl<Traits>::drawHLine(x1, y1, x2, color);
|
||||||
|
|
||||||
|
// Copy all other lines
|
||||||
|
address_t first = address(x1, y1);
|
||||||
|
int w = x2 - x1 + 1;
|
||||||
for (int y=y1; y<=y2; ++y)
|
for (int y=y1; y<=y2; ++y)
|
||||||
ImageImpl<Traits>::drawHLine(x1, y, x2, color);
|
std::copy(first, first+w, address(x1, y));
|
||||||
}
|
}
|
||||||
|
|
||||||
void blendRect(int x1, int y1, int x2, int y2, color_t color, int opacity) override {
|
void blendRect(int x1, int y1, int x2, int y2, color_t color, int opacity) override {
|
||||||
@ -210,13 +219,16 @@ namespace doc {
|
|||||||
|
|
||||||
template<>
|
template<>
|
||||||
inline void ImageImpl<IndexedTraits>::clear(color_t color) {
|
inline void ImageImpl<IndexedTraits>::clear(color_t color) {
|
||||||
std::memset(m_bits, color, width()*height());
|
std::fill(m_bits,
|
||||||
|
m_bits + width()*height(),
|
||||||
|
color);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
inline void ImageImpl<BitmapTraits>::clear(color_t color) {
|
inline void ImageImpl<BitmapTraits>::clear(color_t color) {
|
||||||
std::memset(m_bits, (color ? 0xff: 0x00),
|
std::fill(m_bits,
|
||||||
BitmapTraits::getRowStrideBytes(width()) * height());
|
m_bits + BitmapTraits::getRowStrideBytes(width()) * height(),
|
||||||
|
(color ? 0xff: 0x00));
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
@ -240,6 +252,12 @@ namespace doc {
|
|||||||
(*(m_rows[y] + d.quot)) &= ~(1 << d.rem);
|
(*(m_rows[y] + d.quot)) &= ~(1 << d.rem);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<>
|
||||||
|
inline void ImageImpl<BitmapTraits>::fillRect(int x1, int y1, int x2, int y2, color_t color) {
|
||||||
|
for (int y=y1; y<=y2; ++y)
|
||||||
|
ImageImpl<BitmapTraits>::drawHLine(x1, y, x2, color);
|
||||||
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
inline void ImageImpl<RgbTraits>::blendRect(int x1, int y1, int x2, int y2, color_t color, int opacity) {
|
inline void ImageImpl<RgbTraits>::blendRect(int x1, int y1, int x2, int y2, color_t color, int opacity) {
|
||||||
address_t addr;
|
address_t addr;
|
||||||
|
Loading…
Reference in New Issue
Block a user